List
List
Listは、他言語のListと同様に、同じ型の値のリストを格納する構造体となります。
ScillaのListはキーワードListと一緒に宣言され、2つのコンストラクタを持っています。
Nil
Nilは空のListを作成します。
Nil {'A}は'A型のListを作成しています。
Cons
ConsはListに要素を追加するために使います。
Cons {'A} h lはListであるlの先頭に'A型の要素hを追加します。
※他言語と違い、Listを第二引数とする点には注意が必要です。
下記は、Int32型のListの作成を表しています。
最終的なListは[11 -> 10 -> 2 -> 1 -> NIL]となります。
let one = Int32 1 in
let two = Int32 2 in
let ten = Int32 10 in
let eleven = Int32 11 in
let nil = Nil {Int32} in
let l1 = Cons {Int32} one nil in
let l2 = Cons {Int32} two l1 in
let l3 = Cons {Int32} ten l2 in
Cons {Int32} eleven l3
Listには再帰処理のための関数が用意されています。
※Scillaなどの関数型言語にはループ処理は存在しないため、再帰処理で代用します。
list_foldl
('B -> 'A -> 'B) -> 'B -> (List 'A) -> 'B
list_foldlは反復処理を要素に適用し、Listの'Aを左から右へ反復処理した'Bを返します。
list_foldr
('A -> 'B -> 'B) -> 'B -> (List 'A) -> 'B
list_foldlを同じ処理となりますが、処理方向が右から左となります。
下記はListの要素数を数えています。
let list_length =
tfun 'A =>
fun (l : List 'A) =>
let folder = @list_foldl 'A Int32 in
let init = Int32 0 in
let iter =
fun (h : 'A) =>
fun (z : Int32) =>
let one = Int32 1 in
builtin add one z
in
folder iter init l
list_lengthは、List 'A型の1つの引数lを取る関数を定義しています。
4行目では、Int32型の'AのListのlist_foldlをインスタンス化しています。
5行目では、初期値0を指定しています。
6行目から10行目までは、iterとして引数に与えたInt32型のzをインクリメントします。
最終行では、これまで宣言した関数を実行しています。