Haskell性能:手动无盒装列表?

时间:2014-11-26 12:09:25

标签: performance haskell

根据Haskell文档,you can't pass a primitive value to a polymorphic function or store one in a polymorphic data type. This rules out things like [Int#]

创建自定义列表实现是否有意义,比如IntList,这只是Int专用的列表类型?是否存在?

1 个答案:

答案 0 :(得分:7)

是的,它确实有意义,因为有一些有趣的混合惰性/严格数据结构比严格的,扁平的,未装箱的数组具有更好的复杂性,但比懒惰的盒装结构更有效。

我描述了这样的数据类型,以及在不使用手动拆箱的情况下构建它们的方法:

http://donsbot.wordpress.com/2009/10/11/self-optimizing-data-structures-using-types-to-make-lists-faster/

天真地,您可以使用多态元素的通用表示来转换惰性链表(或类似的惰性结构):

enter image description here

进入"等同于"结构,专门用于表示元素类型的节点,删除每个节点的几个间接:

enter image description here

特别是,多态的spine-lazy,node-strict / unboxed数据类型,但是对每种元素类型专门化容器更加密集,并且具有比通用盒装(多态)数据类型快得多的常数因子。

这是以编译时复杂性和实例生成为代价的,但我认为这是一个富有成效的研究领域。这些类似于模板专用数据类型。

adaptive-containers包是对多态数据类型的类型索引特化的这些想法的实现。

最大的好处将是树木/字典/集合和其他纯功能容器类型。