2014-08-28 67 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