Чистота функций, генерирующих ByteString (или любой объект с компонентом ForeignPtr)

Поскольку 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 в их конструкторе.

14
задан ehird 23 December 2011 в 14:19
поделиться