読者です 読者をやめる 読者になる 読者になる

リスト

リストの構造

リスト=同じ型のデータが任意の数並んだデータ
※レコードは、複数のデータが決められた個数だけ並ぶ。

空のリスト

Ocamlでは空のリストはで表現する。(要素が0個のリスト)
空のリスト
に要素を加えるには

追加する要素 :: []

と書く。

(* 曜日のリスト *)
"Mon" :: "Tue" :: "Wed" :: "Thu" :: "Fri" :: "Sat" :: "Sun" :: []  

("Mon" :: ("Tue" :: ("Wed" :: ("Thu" :: ("Fri" :: ("Sat" :: ("Sun" :: [])))))))

の様に評価される。
常に「要素 :: リスト」の関係になり、これ自身もリストということになる。


リストの様に、リストを定義する際にそのリスト自身を使って定義するデータ型を
再帰的なデータ型、自己参照をするデータ型という。

リストの構文

空のリストは"[]"、リストに要素を追加するには"::"を使ったが
リストを作る場合、以下の様にも書ける。

[1, 2, 3]

これは

1 :: 2 :: 3 :: []

と書くのと全く同じ意味になる。

リストの型

リスト内の要素は全て同じ型にしなければいけない。
※リストの用途としては、同じ処理を大量の似たデータに対して行う場合に使用する。


リストは変数として定義して使用することも出来る。

# let lst = [1 ; 2 ; 3 ; 5 ] ;;
val lst : int list = [1; 2; 3; 5]

パターンマッチ

組、レコードと同様にパターンマッチでリストの要素にアクセスする。

リストの場合、要素数が決まっていないためパターンを複数書くことができる。

# match [1 ; 2 ; 3] with
  	[] -> 0
  	| first :: rest -> first ;;
- : int = 1

は、リスト[1 ; 2 ; 3]に対して

  1. 空リストなら0を返す
  2. 1 :: [2 ; 3]というパターンにマッチしたら先頭要素の1を返す。

※match文では、空かそうでないかの両方を書かないと警告が出る。