Cons运营商“|”在Erlang

时间:2011-12-22 09:24:18

标签: list functional-programming erlang

在阅读LearnYouSomeErlang时,我发现cons运算符用于获取列表的第一个元素。关于它是如何工作的我有点困惑,因为在本书前面他提到cons运算符用于向列表中添加元素。

此函数返回List的第一个元素。

head([H|_]) -> H.

在此页面中找到http://learnyousomeerlang.com/syntax-in-functions

有人可以解释这在返回列表的第一个元素时是如何工作的。

2 个答案:

答案 0 :(得分:9)

cons运算符可用于模式匹配列表。因此,列表可以与[H|T]模式匹配,解析列表,H是列表的第一个元素,T是列表的其余项目。

因此,cons运算符既可用于模式匹配,也可用于构造列表。例如,构造是X = [1|[2,3]]

答案 1 :(得分:5)

我不确定这是否有用,但是......

cons单元描述了一对,其中第一个元素是某种类的术语,第二个元素是指向另一个cons单元格的指针(如果在列表的末尾则为null)。所以,如果你让我使用' - >'作为指针符号,表示一个元素列表的简单cons单元可以是

[1, -> null] = the list [1]. 

[2, -> [1,-> null]] = the list [2,1], etc.

列表可以被认为是cons单元的链表,其中Cons单元的第二个元素是指向下一个链接的指针。

Cons运算符通过创建Cons单元格来创建新列表,其中第一个元素是新的列表元素,第二个元素是指向原始列表的第一个Cons单元格的指针。第一个元素是Head,第二个元素(Tail)是指向'链'中下一个Cons单元格的指针。在Erlang中,上面的内容可以写成

[2 | [1 | []]]

这是列表[2,1]。作为简写,[1 | []]写为[1],所以

 [2|[1|[]]] = [2|[1]]=[2,1]

现在,如果我的列表是[1,2,3],我可以将其表示为其尾部与其尾部相符,

[1|[2,3] 

所以,因为Erlang很棒,所以这个模式可用于匹配,如:“我有一个列表,[1,2,3]可以被描述为一个Cons-ed Hd和一个Tail(指向列表其余部分的高清。)所以

[Hd|Tail] = [1,2,3] 

给出

Hd = 1 

Tail = [2,->[3,->null]] = [2|[3|[]]] = [2|[3]] = [2,3].