扁平列表Erlang需要澄清

时间:2016-02-12 17:52:18

标签: erlang

flatten(X)               -> flatten(X,[]).

flatten([],Acc)          -> Acc;
flatten([[]|T],Acc)      -> flatten(T, Acc);
flatten([[_|_]=H|T],Acc) -> flatten(T, flatten(H,Acc));
flatten([H|T],Acc)       -> flatten(T,Acc++[H]) .

这是来自之前发布的帖子而不是我的代码。

有人可以解释这里发生的事情:

flatten([[_|_]=H|T],Acc)

[[_|_]=H|T]是我无法获得的部分。

(另外这是在另一页,但由于代表我无法对其进行评论。)

1 个答案:

答案 0 :(得分:5)

[[_|_]=H|T]匹配非空列表,其第一个元素也是非空列表。

让我们把它分开:

[      H|T]   %% match the Head and Tail of a list
 [_|_]        %% match the head and tail of the inner list, ignoring the values
      =       %% assign the matched inner list to the variable H

这是Erlang中的常见模式。列表要么具有零个元素,因此匹配[],或者它至少有一个元素,在这种情况下,您可以使用[H|T]提取第一个元素和列表的其余部分。 (该匹配也可以写成[H] ++ T。)