列表

列表是一种基本的、多层次的数据类型。Felix list是一个单链接的纯函数数据类型。列表中的所有值都具有相同的类型。

创建列表。

可以从数组创建列表:

var x = list (1,2,3,4);

还提供了更简洁的符号:

var x = ([1,2,3,4]);

空列表

对于空列表,有两种符号:

var x = list[int] (); // empty list of int
var y = Empty[int];   // empty list of int

显示列表

使用 str 函数,前提是列表中的值也可以转换:

println$ "A list is " + ([1,2,3,4]).str;

级联

列表可以与 + 操作员:

println$ list (1,2,3) + ([4,5,6]);

长度

列表的长度与 len 函数,结果是类型 size

println$ ([1,2,3,4]).len; // 4

前置元素

可以使用Cons函数或使用中缀将新元素推到列表的前面 ! 操作员,甚至 +

var a = ([2,3,4]);
var b = Cons (1, x);
var c = 1 ! a;
var d = 1 + a;

名单 bcd 所有人都有相同的尾巴,名单 a . 这意味着prepend操作是O(1)。它是安全的,因为列表是不可变的。

The use of + is not recommended because it is rather too heavily overloaded. In particular note:

1 + 2 + ([3,4]) // ([3,3,4])
1 + (2 + ([3,4]) // ([1,2,3,4])

因为加法是左关联的。

模式匹配列表

列表通常由执行模式匹配的递归函数解码:

proc show(x:list[int]) =>
  match x with
  | Empty => println$ "end";
  | head ! tail =>
    println$ "elt= " + head.str;
    show tail;
  endmatch
;

文本之间 |=> 称为模式。要分析一个列表,有两种情况:列表是空的,或者列表有一个head元素和一个following tail。如果列表为空,该过程将打印“end”,否则将打印head元素后接tail。