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 :: []などのリストを略記した構文です。