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

List 为什么这些列表在Erlang中不是等价的?,list,erlang,List,Erlang,我试图理解|在Erlang中的用法,更具体地说,为什么这个表达式不等价: [4,5,6 | 7]=:=[4,5,6,7] |符号不只是用于模式匹配,只是为了匹配而打破列表吗 管道|为了创建正确的列表,需要在右侧创建一个列表。管道将从左侧向右侧附加图元。因此,要使用所需的管道创建[4,5,6,7] [4, 5, 6 | [7]] 您尝试的版本会创建所谓的不正确列表。你可以在网站上阅读更多关于它的信息 |符号不只是用于模式匹配吗 不,cons(构造函数)运算符|,可用于通过模式匹配解构列表和构造列

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

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


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

管道
|
为了创建正确的列表,需要在右侧创建一个列表。管道将从左侧向右侧附加图元。因此,要使用所需的管道创建
[4,5,6,7]

[4, 5, 6 | [7]]
您尝试的版本会创建所谓的不正确列表。你可以在网站上阅读更多关于它的信息

|符号不只是用于模式匹配吗

不,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).
在外壳中:

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

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