Erlang List连接,怪异的"|" 标志

mar*_*itz 3 erlang list concatenation bubble-sort

为了熟悉Erlang,我正在尝试编写自己的Bubblesort算法.现在,我的模块中有以下代码:

-module(mysort).
-export([bubblesort/1]).

bubblesort(L) ->
    sort_sequence(L, []).

sort_sequence([H1|[H2|T]], Sorted) ->
    if H2 >= H1 ->
        sort_sequence(T, Sorted ++ [H1, H2]);
    H2 < H1 ->
        sort_sequence(T, Sorted ++ [H2, H1])
    end;
sort_sequence([H|T], Sorted) ->
    Sorted ++ H;
sort_sequence([], Sorted) ->
    Sorted.
Run Code Online (Sandbox Code Playgroud)

首先:请不要给我建议我的代码 我想弄清楚自己^^

问题是:如果我说mysort:bubblesort([2,1,3,4,5]). 输出是我所期望的:[1,2,3,4,5]

但如果我说mysort:bubblesort([2,1,3,5,4]). 输出是:[1,2,3,5|4].

我唯一的问题是:什么"|" 标志在listitems之间意味着什么?!

谢谢你们!

sep*_*p2k 6

列表可以有两种形式:它是空的([]),或者它有一个头和一个尾([H|T]).所以[]是一个空列表,[1 | []]是一个头部为1且尾部为的列表[],[1|2]是一个头部为1且尾部为2的列表.

如果列表为空或其尾部是正确的列表,则列表称为正确列表.所以[]是一个正确的列表,因为它是空的并且[1|[]]是一个正确的列表,因为它的尾部是空列表(这是一个正确的列表),但[1|2]它不是一个正确的列表,因为它的尾部是2和2不是一个正确的列表.

由于正确的列表是最常见的列表类型,并且它们作为嵌套列表进行读取和写入是很麻烦的,因此它们有一种特殊的语法:显示正确的列表,可以通过用逗号分隔子列表的头部来编写.因此,如果我们有正确的列表,[1 | [2 | [3 | []]]]它将显示为[1,2,3](我们也可以这样写),它更具可读性.

这种格式也用于显示不正确列表的开头,如果它们"开始"正确到非正确尾部的点,将用a分隔|.因此,例如,如果我们有不正确的列表[1 | [2 | [3|4]]](这是不正确的,因为最里面的尾部是4,这不是一个正确的列表),它将被显示为[1,2,3|4]将其与正确的列表区分开来,该列表[1 | [2 | [ 3 | [4 | []]]]]将显示为[1,2,3,4].

所以如果你看到类似的东西,你会以某种方式创建一个尾部不是正确列表的列表.


0xA*_*xAX 5

当tail不列出时会发生这种情况:

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

> [1,2,3 | [2]].
[1,2,3,2]
Run Code Online (Sandbox Code Playgroud)