リスト

あいだが開いてしまった。多相や型推論の部分はどうにも頭の整理できないので,先に進もう。

リストは全体を [ と ] で囲って,要素を ; で区切る。[]は空リストを表す。

# [1;2;3];;
- : int list = [1; 2; 3]
# [];;
- : 'a list = []
||<
::(コンスオペレーター)で要素をリストの先頭に追加する。
>||
# 1 :: [2;3;4;5];;
- : int list = [1; 2; 3; 4; 5]

List.length

List.length はリストの長さを返す。

# List.length [1;2;3;4;5];;
- : int = 5

実装してみる。

# List.length [1;2;3;4;5];;
- : int = 5
# let rec length' l =
match l with
[] -> 0
| hd :: tl -> 1 + length' tl
;;
val length' : 'a list -> int = <fun>
# length' [1;2;3;4;5];;
- : int = 5

List.append

List.append は2つのリストを連結する。

# List.append [1;2;3] [4;5;6];;
- : int list = [1; 2; 3; 4; 5; 6]

実装してみる。

# let rec append' l1 l2 =
match l1 with
[] -> l2
| hd::tl -> hd :: append' tl l2
;;
val append' : 'a list -> 'a list -> 'a list = <fun>
# append' [1;2;3] [4;5;6];;
- : int list = [1; 2; 3; 4; 5; 6]

リストの連結は中置演算子 @ でもできる。

# ['a';'b';'c'] @ ['d';'e';'f'];;
- : char list = ['a'; 'b'; 'c'; 'd'; 'e'; 'f']

reverse

reverse はリストを逆順にする。

# let rec reverse l =
match l with
[] -> []
| hd::tl -> (reverse tl) @ [hd]
;;
val reverse : 'a list -> 'a list = <fun>
# reverse [1;2;3;4;5];;
- : int list = [5; 4; 3; 2; 1]