好了,我們開始與[1,1,1,2,2,2,3]
列表。
在第一次調用seq
,二郎將匹配前兩個元素1
和1
到seq
第一「條款」 - seq([X, X | Xs])
。 這將初始化將成爲最終返回值的列表,[1, seq(Xs)]
。此時Xs
將被綁定到值[1,2,2,2,3]
。如果你想知道爲什麼在XS列表的開頭沒有兩個1,那是因爲我們在[X, X | Xs]
上匹配/綁定了其中的兩個。
返回值 = [1 | ?]
(?在剩餘遞歸進行評估)
兩個X = [1,2,2,2,3]
在第二次調用seq
,二郎將匹配輸入列表1
的前兩個元素和2
到第二條款seq([X, Y | Xs])
。然後,我們從這次運行中「返回」列表[X,Y]或[1,2],並用Xs = [2,2,3]調用下一次迭代。
返回值 = [1 | [1, 2 | ?]]
< - 看看遞歸嵌套列表?
兩個X = [2,2,3]
在第三呼叫,前兩個元素是相同的了,所以二郎再次運行所述第一子句。 seq([X, X | Xs]) -> [X | seq(Xs)]
。作爲評估的一部分,我們返回一個2
值,並致電seq([3])
。
返回值 = [1 | [1, 2 | [2 | ?]]]
兩個X = [3]
最後,最後的情況下。我們的名單[3]不匹配[X, X | Xs]
也不[X, Y, Xs]
,所以二郎將運行我們的包羅萬象:seq(_) -> [].
_
將匹配任何東西,而不是值綁定到任何局部變量,所以我們在這裏做的是返回一個空列表[]
。
我們的最終回報值是:[1 | [1, 2 | [2 | []]]]
。如果你將它評估爲erl repl,你會發現它與列表[1,1,2,2]
相同,後者是前者的語法糖。
我假設你想得到[1,2,3]作爲輸出?請說明預期的結果。 – kjw0188
我不想得到任何特定的輸出,我只想了解erlang是如何工作的,我上面介紹的代碼就是一個例子。當我用[1,1,1,2,2,2,3]運行時,我得到[1,1,2,2],我只想知道它是如何得到的[1,1,2,2 ]以瞭解如何執行這些步驟。所以我想有人向我解釋步驟。 –