【问题标题】:Libraries for strict data structures in Haskell [closed]Haskell中用于严格数据结构的库[关闭]
【发布时间】:2014-01-22 17:50:38
【问题描述】:

存在哪些实现严格数据结构的库?具体来说,我正在寻找严格的列表和严格的集合。

免责声明:

  1. 我知道 deepseq。它非常有用,但是每次使用 deepseq 时都会增加遍历整个数据结构的开销(可能不止一次)。

  2. 我知道严格的容器式数据结构不会 确保它包含的所有内容都将得到全面评估,但结构 本身应该是严格的,例如:

    data StrictList a = !a :$ !(StrictList a) | Empty
    

    (这里,包含的元素在 WHNF 中,可能没有完全评估,但列表的结构是。例如,无限列表将是非终止值。)

  3. 我知道关于 hackage 的“严格”包,但它有一个非常 有限的一组严格的数据结构。它既不包含严格 列表或集合。

  4. 自己编写严格的列表似乎非常容易(我喜欢 ghc 的 派生 Functor、Traversable 和 Foldable 的扩展,顺便说一句。),但它 似乎在单独的库中完成会更好。和 集的高效实现对我来说似乎不是那么简单。

【问题讨论】:

  • 为什么需要严格的结构?
  • @FUZxxl 确保立即评估事物通常可以减少空间使用并加快计算速度。它也可能产生相反的效果,因此惰性结构也很重要。对于高效的代码,您需要两者(并且必须知道/找出在哪里使用哪个)。
  • @FUZxxl:我在 Set 上做类似 state-monad 的事情,我会经常从集合中插入和删除元素,但有一段时间不评估 Set。这导致了空间泄漏,可以通过 spin-strict(感谢 John L)数据结构来修复。

标签: haskell


【解决方案1】:

containers 包(与 ghc 一起提供)很快就会有严格的 Set 和 Map 变体(我不确定它们是否会包含在 ghc-7.4 中,但我们有理由希望)。因此,严格的 Sets 和 Maps 的有效实现正在进行中。正如你所说的,严格的列表仍然是一个关于 hackage 的软件包,提供它们会很好,所以不是每个人都必须自己做。你还需要什么?

【讨论】:

  • 听起来不错。我只需要列表和集合(目前)。
【解决方案2】:

关于你的第二点,我最常看到的术语是脊椎严格。

对于一个spine-strict 列表,您可以使用Data.Seq.Sequence(来自容器)或Data.Vector(来自vector)。两者都不是列表,但是取决于您在做什么(或两者)可能会更好。 Sequence 提供 O(1) 的 cons 和 snoc,可以非常快速地访问结构的任一端。 Vector 的性能类似于数组。如果您想要Sequence 的更类似于列表的接口,您可以考虑使用ListLike 包(向量也有一个ListLike 接口,但它不太有用,因为Vector 自己提供了一个相当全面的接口)。两者都非常严格。

对于严格集,您可以尝试unordered-containers,它也提供了严格映射。

【讨论】:

  • spine-strict 是否意味着元素将被评估为 WHNF(如上面我的 StrictList 示例中)?那么,你能不能把第一个感叹号去掉,仍然叫它spine-strict?
  • @shahn: spin-strict 表示容器的结构将被完全评估,但元素可能根本不被评估。所以是的,您可以删除示例中的第一个感叹号,并且仍然保持严格。
猜你喜欢
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2014-01-24
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
相关资源
最近更新 更多