列表
列表是一种基本的、多层次的数据类型。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;
名单 b , c 和 d 所有人都有相同的尾巴,名单 a . 这意味着prepend操作是O(1)。它是安全的,因为列表是不可变的。
使用 + 不推荐使用,因为它的超载非常严重。特别要注意的是:
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。