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

Why are these lists not equivalent in Erlang?

我想了解 | 在 Erlang 中的用法,更具体地说,为什么这个表达式不等价:

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

| 符号不只是用于模式匹配,只是为了匹配它而打破列表吗?

管道 | 为了创建正确的列表,需要在右侧添加一个列表。在右侧,管道从左侧追加元素。所以要用你需要的管道创建 [4, 5, 6, 7]

[4, 5, 6 | [7]]

您尝试的版本创建了所谓的不正确列表。您可以在 Understanding Lists.

阅读更多相关信息

Isn't the | symbol used just for pattern matching.

不,cons(构造函数)运算符 | 可用于通过模式匹配解构列表和构造列表。通常,函数的最后一行是:

 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).

在shell:

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] 将匹配 LastElmt5Tail[],这意味着我们可以匹配不同的当我们调用 get_evens(Tail, Acc) 时的函数子句,例如:

get_evens([], Acc) ->
    lists:reverse(Acc).

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

Match Operator = in Patterns