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。否则,它将尝试将函数调用的两个参数与其下面的另外两个语句之一匹配