【问题标题】:Flatten List Erlang Need Clarification扁平化列表 Erlang 需要澄清
【发布时间】:2016-02-13 02:13:28
【问题描述】:
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] 是我没有得到的部分。

(这也在另一个页面上,但由于代表我无法评论它。)

【问题讨论】:

    标签: erlang


    【解决方案1】:

    [[_|_]=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。)

    【讨论】:

    • 非常感谢。只是为了进一步澄清,如果给我这个列表:[[9,3,4]],在那一行上它会像 H=[] 和 T=[9,3,4] 一样分裂。对吗?
    • 反过来:H = [9,3,4]T = []
    猜你喜欢
    • 2015-07-04
    • 2016-01-14
    • 2011-11-09
    • 2012-07-18
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多