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