顺序Erlang的误解

时间:2014-08-28 21:28:07

标签: erlang

我在这里有这个例子,我用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 个答案:

答案 0 :(得分:3)

好吧,因为你的第一个参数匹配列表的头部,所以使用第二个重载,导致Rest,即[2,3,1,4,1],结束“递归”。与往常一样,编译器是正确的;)

也许你想写example(X, [X | Rest]) -> example(X, Rest)而不是?这确实会删除所有1而不仅仅是第一个。

答案 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)。

答案 2 :(得分: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]).将删除所有元素1。