理解' _' Erlang中的变量

时间:2015-02-19 09:20:20

标签: erlang

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([],_) -> [];是被调用的行。但是,我的理解是,只有当第一个参数为空且_只是占位符时才应调用它。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

这一行:

tail_reverse([], Acc) -> Acc
当处理后的列表变空时,

应该返回累积参数Acc。你用以下代替它:

tail_reverse([], _) -> []

在相同的情况下执行(递归的底部),但忽略先前完成的工作并返回空列表。

对于_变量,它与您的问题没什么关系,但在this答案中对此进行了解释。

答案 1 :(得分:0)

@ bereal的回答是正确的。但是,我将提供我自己对一般问题的答案" _变量如何在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/