Cons运营商"|" 在Erlang

Sca*_*ffe 3 erlang functional-programming list

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

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

head([H|_]) -> H.
Run Code Online (Sandbox Code Playgroud)

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

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

ase*_*ell 9

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

因此,cons运算符既可用于模式匹配,也可用于构建列表.建筑的例子是X = [1|[2,3]].


Jr0*_*Jr0 5

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

cons单元描述一对的第一个元素是某种形式的术语和第二个是一个指针到另一个cons单元(或空如果在列表的末尾).所以,如果你让我使用' - >'作为指针符号,表示一个元素列表的简单cons单元可以是,

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

[2, -> [1,-> null]] = the list [2,1], etc.
Run Code Online (Sandbox Code Playgroud)

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

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

[2 | [1 | []]]

列表[2,1].作为简写,[1 | []]写为[1],所以

 [2|[1|[]]] = [2|[1]]=[2,1]
Run Code Online (Sandbox Code Playgroud)

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

[1|[2,3] 
Run Code Online (Sandbox Code Playgroud)

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

[Hd|Tail] = [1,2,3] 
Run Code Online (Sandbox Code Playgroud)

Hd = 1 
Run Code Online (Sandbox Code Playgroud)

Tail = [2,->[3,->null]] = [2|[3|[]]] = [2|[3]] = [2,3].
Run Code Online (Sandbox Code Playgroud)

  • 请注意,缺点的第二个元素严格来说不必是列表。'[1 | {}]'是完全有效的con单元格用法([1 | 2]一样)。这些都不是正确的列表,但是都将对“ is_list”做出正确的回答。只是不得不让事情更加混乱... :-) (3认同)