Поскольку ByteString
является конструктором с ForeignPtr
:
data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload
{-# UNPACK #-} !Int -- offset
{-# UNPACK #-} !Int -- length
Если У меня есть функция, которая возвращает ByteString
, а затем при вводе, скажем, константе Word8
, функция вернет ByteString с недетерминированным значением ForeignPtr - относительно того, каким будет это значение определяется диспетчером памяти.
Значит ли это, что функция, возвращающая ByteString, не является чистой? Очевидно, что это не так, если вы использовали библиотеки ByteString и Vector. Несомненно, это широко обсуждалось бы, если бы это было так (и, надеюсь, появилось бы в верхней части поиска Google). Как обеспечить соблюдение этой чистоты?
Причина, по которой я задаю этот вопрос, заключается в том, что мне любопытно, какие тонкие моменты связаны с использованием объектов ByteString и Vector с точки зрения компилятора GHC, учитывая член ForeignPtr в их конструкторе.