哈斯克尔。为什么数组比列表更快?

时间:2009-10-15 12:55:06

标签: arrays performance list data-structures haskell

我正在研究Haskell。我有下一个问题:

List类型是Haskell中的基本类型。 Haskell中的数组基于列表。这是索引列表[Ix a]和函数按表格列出 - 对[[Ix a,Value]]列表。为什么Array比列表更快,如果在里面使用列表?

3 个答案:

答案 0 :(得分:21)

我担心你错了。

Haskell中有several implementations个数组,但据我所知,所有数组都是在连续的内存数组之上实现的。因此,有可能O(1)访问元素进行阅读。

数组和列表之间的相似性仅存在于操作集级别上。

答案 1 :(得分:6)

阵列基于列表,它们与其他编程语言类似地实现,具有连续的内存区域。

创建它们的最常用方法是, array 函数将索引,值对列表作为参数,当您打印它们时,它们也会显示为这样的列表。这是因为Haskell中的数组不仅可以通过整数进行索引,还可以通过实现Ix类型类的任何内容进行索引,例如(Int,Int)-pairs,Booleans,Char和许多其他版本。所以[(index,value)]表示实际上是唯一合理,一致的方式来显示数组,就像在Haskell中一样。

答案 2 :(得分:6)

数组不基于列表。列表是常规的递归数据类型:

data [] a = [] | a : [a]

虽然各种数组库(如uvector,array,vector,carray,hmatrix)使用低级读写操作来向数组提供接口。虽然具有不同的复杂性,但两种数据结构都可以表示序列,但没有相似之处。