哪些库存在实现严格数据结构?具体来说,我正在寻找严格的清单和严格的集合。
免责声明:
我知道deepseq。它非常有用,但每次使用deepseq(可能不止一次)时,它会增加遍历整个数据结构的开销。
我知道严格的容器式数据结构不会 确保它所包含的所有内容都将得到充分评估,但结构 本身应该严格,例如:
data StrictList a = !a :$ !(StrictList a) | Empty
(这里,包含的元素在WHNF中,可能没有完全评估,但列表的结构是。例如,无限列表将是非终止值。)
我知道关于hackage的'严格'包装,但它有一个非常的 有限的严格数据结构。它既不含有严格要求 列表或集合。
自己编写严格的列表似乎非常容易(我喜欢ghc的 派生出Functor,Traversable和Foldable的扩展,顺便说一句。),但它 似乎在单独的库中做得更好。和 有效的集合实现对我来说似乎并不重要。
答案 0 :(得分:13)
containers
包(ghc附带)很快会有严格的Set和Map变体(我不确定它们是否会包含在ghc-7.4中,但我们有理由希望)。因此,严格的集合和地图的有效实施正在进行中。正如你所说的那样,严格的清单仍然是一个关于hackage的软件包提供它们会很好,所以不是每个人都必须自己做。你还需要什么?
答案 1 :(得分:7)
对于你的第二点,我最常见的术语是脊柱严格的。
对于脊椎严格列表,您可以使用Data.Seq.Sequence
(来自容器)或Data.Vector
(来自vector)。这两个都不是一个列表,但是根据你正在做什么,一个(或两个)可能会更好。 Sequence提供了O(1)cons和snoc,可以非常快速地访问结构的任何一端。 Vector的性能类似于数组。如果你想要一个更像列表的Sequence
接口,你可以考虑ListLike包(也有一个ListLike接口用于矢量,但它没用,因为Vector提供了一个相当全面的接口) 。两者都是脊柱严格的。
对于严格集,您可以尝试unordered-containers,它也提供严格的地图。