平坦列表Erlang需要澄清

平坦列表Erlang需要澄清,erlang,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(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]) .
[[[u124;|]=H | T]
是我没有得到的部分


(这也在另一个页面上,但由于rep的原因,我无法对其进行评论。)

[[[u124; 124;]=H | t]
匹配第一个元素也是非空列表的非空列表

让我们把它分开:

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

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

非常感谢。为了进一步澄清,如果给我这个列表:[[9,3,4]],在这一行上,它将像H=[]和T=[9,3,4]一样拆分。是吗?反过来说:
H=[9,3,4]
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