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

Erlang (,[])是什么意思?,erlang,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). 我不明白是什么意思。我知道这与模式匹配有关,但我并不完全理解。有人能给我解释一下吗?这意味着一个你不想命名的变量。如果不打算在函数中使用变量

我被问到一个问题:

给定第一个参数中的数字
N
,只选择列表中大于
N
的数字,以便

greater(2,[2,13,1,4,13]) = [13,4,13] 
这就是提供的解决方案:

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

我不明白是什么意思。我知道这与模式匹配有关,但我并不完全理解。有人能给我解释一下吗?

这意味着一个你不想命名的变量。如果不打算在函数中使用变量,可以使用下划线

% 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).
上面是正在发生的事情的伪代码。您还可以有多个未命名的变量。

根据:

匿名变量由下划线(\)表示,在需要变量但可以忽略其值时可以使用该变量

例如:

[H,]=[1,2]%H将为1
文件还指出:

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

这就是提供的解决方案:

member(_,[]) -> false;
member(H,[H|_]) -> true;
member(N,[_,T]) -> member(N,T).
我想你会感到困惑:解函数的名称甚至与问题中的函数名称不一样。当第一个参数是作为第二个参数提供的列表元素时,
member/2
函数返回true,否则返回false

我不明白“uu”是什么意思。我知道这与模式匹配有关,但我并不完全理解。有人能给我解释一下吗

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

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> 
如您所见,变量
\uu
的工作方式类似于变量X,但请注意,第52行没有错误,就像第48行一样。这是因为
变量的工作方式与X略有不同:

53> _.
* 1: variable '_' is unbound
换句话说,
\uu
是一个变量名,因此它最初将匹配任何内容,但与X不同的是,变量
\u
从不绑定/分配值,因此您可以反复使用它来匹配任何内容

\uu
变量也称为不关心变量,因为您不关心该变量与什么匹配,因为它对您的代码不重要,并且您不需要使用它的值

让我们将这些经验教训应用到您的解决方案中。这一行:

member(N,[_,T]) -> member(N,T).
递归调用成员函数,即
member(N,T)
。以及以下功能子句:

member(_,[]) -> false;
member(_,[]) -> false;
当T是空列表时,将匹配函数调用
成员(N,T)
——无论N的值是什么。换句话说,一旦给定的数字N没有匹配列表中的任何元素,即当列表为空,因此没有更多的元素可检查时,则函数子句:

member(_,[]) -> false;
member(_,[]) -> false;
将匹配并返回false

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

member(N, []) -> false;

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

如果这是重复的,很抱歉

什么是(,[])意思?

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

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