给定模块
-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]]}
我无法理解为什么我们在列表中获得列表,而不是答案中的列表。非常感谢您的解释,谢谢。
答案 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
,它会被重复1
和B
,这是所有剩余元素的列表。在我们的例子中,只剩下一个元素,所以我们返回一个元素列表。此元素是一个双元素列表,因此列在列表[[1, 1]]
中。