Erlang新手在这里。我来自Java背景,我发现Erlan相当有趣。遵循优秀的书"了解一些Erlang"。
这里有一个关于递归的例子,如书中给出的用于反转列表顺序的:
tail_reverse(L) -> tail_reverse(L,[]).
tail_reverse([],Acc) -> Acc;
tail_reverse([H|T],Acc) -> tail_reverse(T, [H|Acc]).
这可以按预期工作。但是,如果我将代码更改为:
tail_reverse(L) -> tail_reverse(L,[]).
tail_reverse([],_) -> [];
tail_reverse([H|T],Acc) -> tail_reverse(T, [H|Acc]).
现在总是返回[]
,无论传递的List的内容如何。所以似乎行tail_reverse([],_) -> [];
是被调用的行。但是,我的理解是,只有当第一个参数为空且_
只是占位符时才应调用它。
我在这里缺少什么?
答案 0 :(得分:3)
这一行:
tail_reverse([], Acc) -> Acc
当处理后的列表变空时,应该返回累积参数Acc
。你用以下代替它:
tail_reverse([], _) -> []
在相同的情况下执行(递归的底部),但忽略先前完成的工作并返回空列表。
对于_
变量,它与您的问题没什么关系,但在this答案中对此进行了解释。
答案 1 :(得分:0)
_
变量如何在Erlang中起作用。我最近在_
变量上写了一篇博文:
匿名变量由单个下划线(_)表示。当需要变量但需要忽略该值时,将使用匿名变量。匿名变量实际上从来没有绑定到它的值。由于该值永远不会被绑定,因此可以在模式中多次使用,并且每次允许它匹配不同的值。例如:
1> {_, _} = {foo, bar}.
{foo, bar}
2> _.
* 1: variable '_' is unbound
4> {_, Second} = {foo, bar}.
{foo, bar}
5> _.
* 1: variable '_' is unbound
6> Second.
bar
此处提供更多内容: http://stratus3d.com/blog/2014/11/05/everything-you-need-to-know-about-erlangs-magic-variable/