【问题标题】:What is the type parameter in the bytestring builder internals for?字节串构建器内部的类型参数是什么?
【发布时间】: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)

类型参数(ra)有什么用途?

【问题讨论】:

  • 我怀疑它类似于ST 中的幻像参数——它会阻止您在不存在数据的上下文中使用指针。
  • @leftaroundabout 看起来不像幻像类型参数,因为在 Done 构造函数中有一个类型为 a 的字段。
  • @leftaroundabout 你能用ST 扩展该功能吗?或者你有参考吗?
  • @sjakobi ST monad 有一个额外的 s 参数,它实际上并没有用于任何事情。类型系统确保此参数沿任何给定的可变计算“同步”。要从此类计算中实际获得任何结果,您需要使用 runST,其 Rank-2 类型会阻止您将 s 固定为任何特定的东西。因此,如果您走私出对例如的参考这种计算中的可变数组,你可以在其他地方使用它,因为 s 类型不匹配。

标签: haskell bytestring


【解决方案1】:

不需要。作为证明,我有 created a fork,它不会更改任何公共 API(仅更改名为 Internal 的模块的 API),但会删除此类型参数。

【讨论】:

  • 您是否知道bytestringInternal 模块的兼容政策是什么样的?我知道例如attoparsec 实际上确实在bytestring 的内部(example) 中翻找,所以,不管你喜不喜欢,改变内部API 可能会破坏下游的依赖关系。我想bytestring 的维护者可能愿意接受这样的 PR
  • 感谢您的调查,@daniel-wagner!我注意到 Simon Meier 的 original design 没有类型参数,但我仍然想知道为什么要添加它们。
  • @sjakobi 我怀疑它是作为“以防万一”放在那里的:以防万一有人想计算一些有趣的、潜在的结构化值 about ByteString 为他们正在建造它。然后事实证明,人们不想这样做——至少,我们今天在库中的代码中不是这样。是否有人依赖这种能力是一个我们可能永远无法合理地否定的问题。
  • @Shersh 也许吧。有兴趣将其变成 PR 的人可能会更加小心,只删除没有额外类型参数就不可能的内容。我选择了最容易组合并验证类型检查的更改,而不是最小的更改——而且我对完成将补丁从“概念证明”变为“可接受”可能需要的工作并不超级感兴趣给字节串维护者”。当然,如果你关心这个,欢迎你自己做。
  • @Shersh:我现在已经创建了github.com/haskell/bytestring/issues/154
【解决方案2】:

Builder 设计的作者 Simon Meier,has responded 回答我在 bytestring 问题跟踪器上的问题:

类型参数用于支持 Put monad(Writer 专门用于在计算其值期间填充缓冲区)。

Put 定义为

newtype Put a = Put { unPut :: forall r. (a -> BuildStep r) -> BuildStep r }

并从隐藏在当前bytestring 版本中的Data.ByteString.Builder.Internal 导出。

【讨论】:

    猜你喜欢
    • 2023-02-11
    • 2012-10-24
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多