这是什么意思?

时间:2019-03-08 13:18:44

标签: erlang

我被问到一个问题:

在第一个参数中给出数字N只会选择列表中大于N的数字,因此

greater(2,[2,13,1,4,13]) = [13,4,13] 

这是提供的解决方案:

member(_,[]) -> false;
member(H,[H|_]) -> true;
member(N,[_,T]) -> member(N,T).

我不明白“ _” 的含义。我了解它与模式匹配有关,但我并不完全了解。有人可以给我解释一下

4 个答案:

答案 0 :(得分:2)

  

这是提供的解决方案:

我认为您很困惑:解决方案函数的名称甚至与问题中函数的名称不同。当第一个参数是作为第二个参数提供的列表的元素时,member/2函数返回true,否则返回false。

  

我不明白“ _”的含义。我了解它与模式匹配有关,但我并不完全了解。有人可以给我解释一下

_是一个变量名,并且像任何变量一样,它将匹配任何内容。以下是一些模式匹配的示例:

35> f().  %"Forget" or erase all variable bindings
ok

45> {X, Y} = {10, 20}.
{10,20}

46> X.                
10

47> Y.
20

48> {X, Y} = {30, 20}.
** exception error: no match of right hand side value {30,
                                                       20}

现在为什么第48行不匹配? X已经被绑定到10,Y已经被绑定到20,所以erlang用这些变量的值替换了这些变量,从而得到了:

48> {10, 20} = {30, 20}.

...那些元组不匹配。

现在让我们尝试使用名为_的变量:

49> f().
ok

50> {_, Y} = {10, 20}.
{10,20}

51> Y.  
20

52> {_, Y} = {30, 20}.
{30,20}

53> 

如您所见,变量_的工作方式类似于变量X,但是请注意,第52行没有错误,就像第48行一样。这是因为_变量与X的工作方式略有不同:

53> _.
* 1: variable '_' is unbound

换句话说,_是一个变量名,因此它最初将匹配任何内容,但是与X不同,变量_从未绑定/分配任何值,因此可以在再没有错误地匹配任何东西。

_变量也称为无关变量,因为您不在乎该变量匹配什么,因为它对代码不重要,并且不需要使用其值。

让我们将这些课程应用于您的解决方案。这行:

member(N,[_,T]) -> member(N,T).

递归调用成员函数,即member(N, T)。并且,下面的函数子句:

member(_,[]) -> false;
每当T为空列表时,

都会与函数调用member(N, T)匹配-不管N的值是多少。换句话说,一旦给定的数字N与列表中的任何元素都不匹配,即当列表为空时不再有要检查的元素,则使用函数子句:

member(_,[]) -> false;

将匹配并返回false。

您可以这样重写该函数子句:

member(N, []) -> false;

但是erlang会警告您N是函数主体中未使用的变量,这是一种表达方式:“您确定在函数定义中没有记错吗?您定义了一个名为N的变量,但是您没有在函数主体中使用它!”告诉erlang函数定义确实正确的方法是将变量名N更改为_(或_N)。

答案 1 :(得分:0)

这表示您无需命名的变量。如果您永远不会在函数内使用变量,则可以使用下划线。

% if the list is empty, it has no members
member(_, []) -> false.

% if the element I am searching for is the head of the list, it is a member
member(H,[H|_]) -> true.

% if the elem I am searching for is not the head of the list, and the list
% is not empty, lets recursively go look at the tail of the list to see if 
% it is present there
member(H,[_|T]) -> member(H,T).

上面是发生情况的伪代码。您还可以有多个'_'未命名变量。

答案 2 :(得分:0)

根据Documentation

  

匿名变量用下划线(_)表示,可以在需要变量但可以忽略其值的情况下使用。

示例:

[H, _] = [1,2] % H will be 1

文档也说:

  

以下划线(_)开头的变量(例如_Height)是常规变量,而不是匿名变量。但是,它们在不会为未使用的变量生成任何警告的意义上被编译器忽略。

答案 3 :(得分:0)

对不起,如果这是重复的...

(_,[])是什么意思?

这意味着(1)两个参数,(2)第一个匹配任何事物,但我不在乎(您要告诉Erlang通过下划线忘记它的值)和(3)第二个参数是一个空列表。

鉴于Erlang将变量的值绑定或匹配(取决于特定情况),在这里,您基本上是在寻找第二个参数与空列表的匹配项(如条件语句)。如果发生匹配,该语句返回 false 。否则,它将尝试将函数调用的两个参数与其下面的其他两个语句之一进行匹配。