代码之家  ›  专栏  ›  技术社区  ›  Bercovici Adrian

为什么这些列表在erlang中不等价

  •  0
  • Bercovici Adrian  · 技术社区  · 5 年前

    我试图了解 | 在erlang中,更具体地说,为什么这个表达式不等价:

    [4,5,6|7]=:=[4,5,6,7]

    是不是 | 只用于模式匹配的符号,只用于断开列表以匹配它?

    1 回复  |  直到 5 年前
        1
  •  8
  •   Wojtek Surowka    5 年前

    管子 | 为了创建一个正确的列表,需要在右边有一个列表。在这个右侧,管道从左侧附加元素。所以要创造 [4, 5, 6, 7] 用你需要的烟斗

    [4, 5, 6 | [7]]
    

    您尝试的版本创建了所谓的 不恰当的清单 是的。你可以在 Understanding Lists 是的。

        2
  •  7
  •   7stud    5 年前

    不是只用于模式匹配的符号。

    不,那个 欺骗 (构造函数)运算符, | ,既可用于解构具有模式匹配的列表,也可用于构造列表。通常,函数的最后一行是:

     my_func(tail, [Head|Acc])
    

    在这一行中,cons操作符为第二个参数创建一个列表。第二个参数是添加变量内容的列表 Head 到前面 Acc 列表。

    下面是一个使用cons运算符解构列表和构造列表的示例:

    -module(a).
    -compile(export_all).
    
    get_evens(List) -> 
        get_evens(List, []). %% Add an empty list to the function call to accumulate the results.
    
    get_evens([Head|Tail], Acc) when Head rem 2 == 0 ->  %% deconstruct the first argument into Head and Tail
        get_evens(Tail, [Head|Acc]);  %% construct the second argument for the get_evens() function call
    get_evens([_Head|Tail], Acc) ->
        get_evens(Tail, Acc);
    get_evens([], Acc) ->
        lists:reverse(Acc).
    

    在外壳中:

    2> c(a).
    {ok,a}
    
    3> a:get_evens([1, 2, 3, 4, 5]).
    [2,4]
    
    4> 
    

    我们可以编写递归函数以在找到空列表时结束的全部原因是可以这样定义列表:

    4> [1|[2|[3|[4|[5|[]]]]]].
    [1,2,3,4,5]
    

    注意5与空列表的关系: 5|[] 是吗?也就是说当你到了列表的末尾, [LastElmt | Tail] 将匹配 LastElmt 5 Tail [] ,这意味着我们可以在调用 get_evens(Tail, Acc) ,例如:

    get_evens([], Acc) ->
        lists:reverse(Acc).
    
        3
  •  0
  •   Samwar    5 年前

    与使用 | ,但与您关于模式匹配的问题有关。这个 = 用于赋值,但由于数据在erlang中是不可变的,所以它也是一个基本的模式匹配和等价性测试。

    Match Operator = in Patterns