haskell - 数据结构的惰性与严格实现

标签 haskell containers

有一个具有惰性和严格实现的数据结构列表:

  • Data.Map.LazyData.Map.Strict
  • Data.IntMap.LazyData.IntMap.Strict
  • Data.HashMap.LazyData.HashMap.Strict
  • Data.ByteString.LazyData.ByteString.Strict
  • Data.Text.LazyData.Text

  • 这些实现的优势和劣势是什么?在选择特定实现时要遵循哪些规则?

    最佳答案

  • Data.XYMap.LazyData.XYMap.Strict

  • 对于 XY{"", "Int", "Hash"} : *.Strict变体在将映射到的值放入映射之前强制将其评估为 WHNF。

    这样做的最大优势是更可预测的空间和时间行为,因为构建巨大的 thunk 要困难得多,尤其是对于表单类型 (ConstructorN UnboxedValueTypeN),这是不可能的。

    缺点 - 我记得在讨论严格或惰性变体是否应该成为默认变体时提出了一些例子,但我不记得有什么特别的事情。

    啊,刚刚想起一个用例:可以用Lazy打结。变体,这当然是不可能的 Strict版本!所以如果你做这样的事情:Lazy .

    我使用 Strict默认版本。直到我需要打结或遇到另一个我考虑 Lazy 的用例变种优越,我不知道什么时候会使用它们。
  • Data.(ByteString/Text).LazyData.(ByteString/Text).Strict

  • 严格的版本使用一个单一的存储 block 来存储有效负载,这意味着您可以快速随机访问,不仅可以顺序访问,还可以从末尾向后或来回跳转。

    惰性版本基本上是严格 block 的头部严格列表,它们的优势在于它们的顺序消耗通常可以在恒定的小内存中完成,如果您需要顺序处理大文件,那就太好了。

    对于小(ish)数据,绝对使用 Strict变体,对于海量数据,Lazy如果数据是按顺序处理(或多或少)的变体。

    关于haskell - 数据结构的惰性与严格实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16296571/

    相关文章:

    haskell - 无法将多个客户端与 Haskell Websocket 服务器一起使用

    haskell - 我怎样才能体面地将 "undo"功能添加到状态单子(monad)?

    haskell - 在 Haskell quasiquoter 中拼接任意表达式

    azure - 在 Azure 应用服务上为容器启用 SSH 会将垃圾转储到日志流中,我做错了什么吗?

    列表的 Haskell 映射函数

    list - 转换 [整数] -> 整数

    c++ - 通过2个字段查找特定对象的 vector 元素

    Docker错误无法删除docker容器,冲突: unable to remove repository reference

    Python docker sdk如何在container.run中设置cpu计数

    c++ - 如何用cpp中的 map 内容覆盖文件