List 为什么函数式语言如此频繁地使用列表?
我的意思是,list在其他数据结构上有什么优势使得它在函数式语言中几乎是不可避免的?“没有勺子。” 如果我告诉你没有弦这回事怎么办?仅存在单个字符的列表 那如果我告诉你没有列表呢?只有成对的List 为什么函数式语言如此频繁地使用列表?,list,functional-programming,List,Functional Programming,我的意思是,list在其他数据结构上有什么优势使得它在函数式语言中几乎是不可避免的?“没有勺子。” 如果我告诉你没有弦这回事怎么办?仅存在单个字符的列表 那如果我告诉你没有列表呢?只有成对的 ;构造一对a和b (反对意见a’b);=>(‘a’b) ; 获取该对的第一个元素 (第一个(反对“a”和“b”);=>'A. ; 获取该对中的第二个元素 (第二个(cons'a'b));=>'B ; 创建“列表” (定义x(cons'a(cons'b)(cons'c(cons'd)(cons'e null(
;构造一对a和b
(反对意见a’b);=>(‘a’b)
; 获取该对的第一个元素
(第一个(反对“a”和“b”);=>'A.
; 获取该对中的第二个元素
(第二个(cons'a'b));=>'B
; 创建“列表”
(定义x(cons'a(cons'b)(cons'c(cons'd)(cons'e null()))))
; => ('a('b('c('d('e(')))))
; 获取“列表”中的第三个元素x
(第一(第二(第二x)))
; => 'C
如果我告诉你,世界上没有成对的东西呢?只存在lambdas
(定义(cons x y)
(λ(f)(fxy)))
(定义(第一个p)
(p(λ(xy)x)))
(定义(第二个p)
(p(λ(xy)y)))
当然,这只是一种可能的实现。但重要的是要认识到这一切都只是一种幻觉
数据抽象确实很神奇。好的语言可以让你发明任何你想使用的结构,并定义任何构造函数/选择器,使之对你的结构有用。有些语言只是提供了比其他语言更多的语法糖分
列表很常见,因为作为程序员,我们经常处理事物的有序集合。其他常见类型是集合和映射。只是不要自欺欺人地认为它有什么特别之处^,^函数式语言更喜欢不变性,所以在数据结构方面,函数式语言更喜欢不变性。简言之,持久数据结构是数据结构,我们可以在其中继续访问结构的任何以前版本以及当前版本。我们不改变现有的数据结构,我们只是使用现有的数据结构作为基础来创建一个新的数据结构 对于任何数据结构,这都可以通过复制来完成。例如,考虑某些伪f:< /P> 要实现
append
功能,我们必须创建一个新的n+1
大小的数组,并用array1
的副本和要追加的元素填充它
请注意,这不是很有效,每个追加都需要n
拷贝和为整个结构分配内存
请考虑我们定义的某种类型:
type List<'a> =
|Empty
|Cons of 'a * List<'a>
在这种情况下,list2
只是指list1
,不需要复制。因此,在列表的开头加上前缀是一个O(1)操作,并且内存占用量仅随每个元素线性增长,而不考虑数据持久性
还有许多其他持久性数据结构,二叉树通常用于生成不可变的集合和字典。手指树可以作为DEQUE和优先级队列等结构的基础
因此,简言之,列表在函数式语言中被广泛使用,因为它们是一种简单、高效、持久的数据结构
type List<'a> =
|Empty
|Cons of 'a * List<'a>
let list1 = [1..1000000]
let list2 = Cons (0, list1) // [0..1000000]