【发布时间】:2018-04-04 11:46:05
【问题描述】:
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中的幻像参数——它会阻止您在不存在数据的上下文中使用指针。 -
@leftaroundabout 看起来不像幻像类型参数,因为在
Done构造函数中有一个类型为a的字段。 -
@leftaroundabout 你能用
ST扩展该功能吗?或者你有参考吗? -
@sjakobi
STmonad 有一个额外的s参数,它实际上并没有用于任何事情。类型系统确保此参数沿任何给定的可变计算“同步”。要从此类计算中实际获得任何结果,您需要使用runST,其 Rank-2 类型会阻止您将s固定为任何特定的东西。因此,如果您走私出对例如的参考这种计算中的可变数组,你可以在其他地方使用它,因为s类型不匹配。
标签: haskell bytestring