2011-12-22 61 views
3

閱讀LearnYouSomeErlang時,我發現cons運算符用於獲取列表的第一個元素。關於這是如何工作的,我有點困惑,因爲在本書的前面他提到了使用cons運算符將元素添加到列表中。缺點運算符「|」在Erlang

該函數返回列表的第一個元素。

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

在本頁找到http://learnyousomeerlang.com/syntax-in-functions

有人可以解釋這是如何工作的返回列表的第一個元素。

+0

實質上這只是下降的尾巴變成_,未使用的變量。 – Tommy 2016-02-02 01:57:11

回答

8

cons運算符可用於模式匹配列表。所以一個列表可以被模式匹配到[H|T],它將解構列表,H是列表的第一個元素,T是列表的其餘項。

因此,操作者缺點是既用於模式匹配並且還構造列表。結構例如是X = [1|[2,3]]

5

我不知道這是否會是有用的,但是......

一個利弊細胞描述一對的第一個元素是某種形式的長期,第二個是一個指向另一個cons單元格(或者如果在列表末尾則爲null)。所以,如果你讓我用「 - >」爲指針符號,代表一個元素的列表,一個簡單的利弊細胞可能是,

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

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

列表可以被看作缺點細胞的鏈表其中Cons單元格的第二個元素是指向下一個鏈接的指針。

甲缺點操作者通過創建一個缺點細胞,其中所述第一元件是一個新的列表元素和第二個元素是一個指針,指向原始列表的第一個缺點細胞創建一個新的列表。第一元件是頭,和第二元件(尾)是指針下一個缺點細胞在「鏈」。 Erlang中,上述可被寫爲

[2 | [1 | []]]

這是列表[2,1]。作爲短手,[1 | []]寫爲[1],因此

現在
[2|[1|[]]] = [2|[1]]=[2,1] 

,如果我的列表是[1,2,3],我可以代表它作爲它的頭缺點 - 版用尾巴如,

[1|[2,3] 

所以,因爲Erlang是真棒,這種模式是可用的,以匹配如:「我有一個列表,[1,2,3],它被描述爲一缺點-ED HD和尾(的指針列表的其餘部分的HD)所以

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

給人

Hd = 1 

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

請注意,cons的第二個元素並不嚴格地必須是一個列表。 '[1 | {}]'是完全有效的單元格使用情況(如[1 | 2])。這些都不是正確的列表,但都會回答'is_list'。只是不得不把這個問題更多地混淆...... :-) – 2011-12-26 19:31:00