我在这里有这个例子,我用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]。怎么会?要么我太累了,要么我不理解这些东西。
非常感谢帮助!
答案 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。