リスト

 

MLでは特別な多相データ型として、リストが最初から定義されています。MLのリストは、空のリスト[]か、要素xをリストyに連結したx :: yという形(「consセル」といいます)のどちらかです。先のtreeと違って最初から定義されているので、普通の構文ではないのですが強いていえば

 

type 'a list = [] of unit | :: of 'a * 'a list

 

のように考えることもできなくはありません。

 

たとえば、とにかくランダムにリストを生成する関数make_random_list

 

# let rec make_random_list () =

    if Random.int 3 = 0 then [] else

    Random.int 10 :: make_random_list () ;;

val make_random_list : unit -> int list = <fun>

# make_random_list () ;;

- : int list = [4]

# make_random_list () ;;

- : int list = [3; 2; 3; 1; 7; 5; 9; 2; 1; 4; 9; 1]

# make_random_list () ;;

- : int list = []

 

のように定義できますし、リストの長さを返す関数length

 

# let rec length = function

    [] -> 0

  | _ :: list -> 1 + length list ;;

val length : 'a list -> int = <fun>

# length [1; 2; 3] ;;

- : int = 3

 

のように定義できます。ただし[1; 2; 3]という形の式は、1 :: 2 :: 3 :: []などのリストを略記した構文です。

 

次へ進む