Основные типы данных Data.ByteString.Builder
:
newtype Builder = Builder (forall r. BuildStep r -> BuildStep r)
type BuildStep a = BufferRange -> IO (BuildSignal a)
data BuildSignal a =
Done {-# UNPACK #-} !(Ptr Word8) a
| BufferFull
{-# UNPACK #-} !Int
{-# UNPACK #-} !(Ptr Word8)
(BuildStep a)
| InsertChunk
{-# UNPACK #-} !(Ptr Word8)
S.ByteString
(BuildStep a)
Какой цели служит параметр типа (r
или a
)?
ST
— он не позволяет вам использовать указатели в контексте, где данные не существуют. - person leftaroundabout   schedule 04.04.2018Done
есть поле с типомa
. - person Shersh   schedule 04.04.2018ST
или у вас может быть ссылка? - person sjakobi   schedule 05.04.2018ST
монада имеет дополнительный параметрs
, который на самом деле ни для чего не используется. Система типов гарантирует, что этот параметр «синхронизируется» с любым заданным изменяемым вычислением. Чтобы получить какой-либо результат из такого вычисления, вам нужно использоватьrunST
, чей тип Rank-2 не позволяет вам привязатьs
к чему-либо конкретному. Так что, если вы тайком вытащите ссылку, например, на изменяемый массив из такого вычисления, вы можете сделать с ним в другом месте, потому что типs
не соответствует. - person leftaroundabout   schedule 05.04.2018