2014-08-28 65 views
0

我在這裏有本例中,我用1運行它,[1,2,3,1,4,1]序貫二郎誤解

example(_, []) -> []; 
example(X, [X | Rest]) -> Rest; 
example(X, [Y | Rest]) -> [Y | example(X, Rest)]. 

在我的頭(即附連到我的身體)我得到[2,3,4],但編譯器說[2,3,1,4,1]。怎麼來的?要麼我太累了,要麼我不正確地理解這些東西。

幫助表示讚賞!

回答

3

好吧,由於您的第一個參數與列表頭一致,因此使用第二個過載,導致Rest(即[2,3,1,4,1])結束「遞歸」。一如既往,編譯器是正確的;)

也許你想寫example(X, [X | Rest]) -> example(X, Rest)而不是?這確實會刪除所有的1,而不僅僅是第一個。

1

子句從上到下匹配。

您致電example(1, [1,2,3,1,4,1])

首先,erlang會嘗試重新匹配(_,[])。這將失敗,因爲你的第二個參數不是空列表。

第二場比賽將對陣(X,[X | Rest)X變爲有界1,所以第二個參數「is」現在是[1 | Rest]。這將成功與[1,2,3,1,4,1]進行匹配,因爲第一個列表項是1(值爲X)。

1

你可以試試:

example(_, []) -> []; 
example(X, [X | Rest]) -> example(X, Rest); 
example(X, [Y | Rest]) -> [Y | example(X, Rest)]. 

wy:example(1, [1,2,3,1,1]).將刪除所有elment 1.

+0

這一個爲3小時到很晚,提供相比於KRAB和我現有的答案絕對沒有其他信息。 – filmor 2014-08-29 07:55:34