Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 哈斯克尔。为什么数组比列表快?_Arrays_Performance_List_Data Structures_Haskell - Fatal编程技术网

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

Arrays 哈斯克尔。为什么数组比列表快?,arrays,performance,list,data-structures,haskell,Arrays,Performance,List,Data Structures,Haskell,我在学习哈斯克尔。我有下一个问题: 列表类型是Haskell中的基本类型。 Haskell中的数组基于列表。这是索引列表[Ix a]和表-对列表[(Ix a,值)]显示的函数。如果数组中使用列表,为什么数组比列表快?恐怕你错了 Haskell中有很多数组,但据我所知,它们都是在连续内存数组之上实现的。因此,有可能O(1)访问元素进行读取 数组和列表之间的相似性只存在于操作集级别。恐怕你错了 Haskell中有很多数组,但据我所知,它们都是在连续内存数组之上实现的。因此,有可能O(1)访问元素进行

我在学习哈斯克尔。我有下一个问题:

列表类型是Haskell中的基本类型。
Haskell中的数组基于列表。这是索引列表[Ix a]和表-对列表[(Ix a,值)]显示的函数。如果数组中使用列表,为什么数组比列表快?

恐怕你错了

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


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

恐怕你错了

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


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

数组不是基于列表的,它们的实现类似于其他编程语言,具有连续的内存区域


创建它们最常用的方法是,数组函数将索引、值对列表作为参数,当您打印它们时,它们也会像这样的列表一样显示。这是因为Haskell中的数组不仅可以由整数索引,还可以由实现Ix typeclass的任何东西索引,例如(Int,Int)-对、布尔、Char和许多其他版本。因此[(索引,值)]表示法实际上是唯一明智、一致的方法,可以像Haskell中的数组一样显示数组。

数组是而不是基于列表,它们的实现与其他编程语言类似,具有连续的内存区域


创建它们最常用的方法是,数组函数将索引、值对列表作为参数,当您打印它们时,它们也会像这样的列表一样显示。这是因为Haskell中的数组不仅可以由整数索引,还可以由实现Ix typeclass的任何东西索引,例如(Int,Int)-对、布尔、Char和许多其他版本。因此[(索引,值)]表示法实际上是唯一明智、一致的方法,可以像Haskell中的表示法一样显示数组。

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

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

而各种阵列库,如uvector、array、vector、carray、hmatrix,则使用低级读写操作来表示阵列接口。除了两种数据结构都可以表示序列之外,没有什么相似之处,尽管它们的复杂性不同。

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

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

而各种阵列库,如uvector、array、vector、carray、hmatrix,则使用低级读写操作来表示阵列接口。除了两种数据结构都可以表示序列之外,没有什么相似之处,尽管它们的复杂性不同。

什么操作更快?您如何知道它更快?例如,添加到(数组/列表)的末尾,或获取i元素。无论是
Data.array
还是
Data.list
都需要“复制所有内容”才能添加到(数组/列表)的末尾。是的,
Data.array.MArray
都有固定的边界。如果要更改元素的数量,必须创建一个新数组。哪些操作更快?您如何知道它更快?例如,添加到(数组/列表)的末尾,或获取i元素。无论是
Data.array
还是
Data.list
都需要“复制所有内容”才能添加到(数组/列表)的末尾。是的,
Data.array.MArray
都有固定的边界。如果要更改元素的数量,必须创建一个新数组。因此,不要在haskell上设计更快的数据结构。所有好的“数据结构”都是用其他语言编写的。可以是С\С++。我说的对吗?@Anton:不,很棒的数据结构(如手指树)可以在纯Haskell中实现。推荐阅读:因此,不要在Haskell上设计更快的数据结构。所有好的“数据结构”都是用其他语言编写的。可以是С\С++。我说得对吗?@Anton:不,可怕的数据结构(如手指树)可以在纯Haskell中实现。推荐阅读:Haskell不是具有连续内存区域的语言吗?@Anton:Haskell'98语言规范要求存在
Array
模块(以及相关的类、类型和函数)。除了“程序员可以合理地期望快速访问组件”之外,它没有提到实现,但这通常是一个连续随机存取内存的接口。haskell语言不是具有连续内存区域吗?@Anton:haskell'98语言规范要求存在
Array
模块(以及相关的类、类型和函数)。除了“程序员可以合理地期望快速访问组件”之外,它对实现没有任何说明,但这通常被视为连续随机访问内存的接口。