[ERLANG]:为什么回答列表中的列表而不是列表?

时间:2014-10-27 10:44:02

标签: list erlang tuples

给定模块

-module(p1). 

-export([f2/2]). 

f2([A, A | B]) -> {A, B}; 
f2([A, B | _]) -> {A, B}; 
f2([A]) -> A; 
f2(_) -> no_match. 

我被要求尝试输入值

 p1:f2([1,1,[1,1]]). 

我的回答是这个输入值与f2的第一个函数子句匹配,因此给出了结果:

{1,[1,1]}

但根据给出的答案纸,答案是

{1,[[1,1]]}

我无法理解为什么我们在列表中获得列表,而不是答案中的列表。非常感谢您的解释,谢谢。

1 个答案:

答案 0 :(得分:2)

您应该了解Erlang中的尾部如何工作。尾巴总是一个清单;可以是一个单元素列表,可以是一个空列表,但总是一个列表。

让我们看一下shell中的例子:

2> Fun = fun([H | T]) -> {H, T} end. 
#Fun<erl_eval.6.90072148>
3> Fun([a]).
{a,[]}
4> Fun([a,b]).
{a,[b]}
5> Fun([a,[a,b]]).
{a,[[a,b]]}
6> Fun([a,b,c]).  
{a,[b,c]}
7> Fun([a,b,c,d]).
{a,[b,c,d]}

因此,在您的情况下,您要返回的是A,它会被重复1B,这是所有剩余元素的列表。在我们的例子中,只剩下一个元素,所以我们返回一个元素列表。此元素是一个双元素列表,因此列在列表[[1, 1]]中。