module List:リスト操作sig..end
いくつかの関数は末尾再帰的ではありません。 末尾再帰の関数のスタック使用量は一定で、非末尾再帰の関数はリストの長さに比例したスタックを使用します。 非常に長いリストに対しては末尾再帰でないことが問題になる可能性があります。 関数が複数のリストを引数に取る場合には、近似的なスタック使用量を(何らかの適当な単位で)括弧書きで示します。
引数のリストが 10000 要素を越えない場合には、通常上のようなことは無視してかまいません。
val length : 'a list -> intval hd : 'a list -> 'aFailure "hd" 例外が発生します。val tl : 'a list -> 'a listFailure "tl" 例外が発生します。val nth : 'a list -> int -> 'an 番目の要素を返します。最初の要素(リストの先頭)を 0 番目とします。
リストが空の場合には Failure "nth" 例外が発生します。val rev : 'a list -> 'a listval append : 'a list -> 'a list -> 'a list@ と同じ関数です。
末尾再帰ではありません(最初の引数の長さに比例します)。
@ 演算子も末尾再帰ではありません。val rev_append : 'a list -> 'a list -> 'a list
val concat : 'a list list -> 'a listval flatten : 'a list list -> 'a listconcat と同じです。
末尾再帰ではありません(引数リストの長さ + 部分リストの長さの最大値に比例します)。val iter : ('a -> unit) -> 'a list -> unitList.iter f [a1; ...; an] は関数 f を a1; ...; an に順に適用します。
これは begin f a1; f a2; ...; f an; () end と等価です。val map : ('a -> 'b) -> 'a list -> 'b listList.iter f [a1; ...; an] は関数 f を a1; ...; an に適用し、
f の戻り値を使ってリスト [f a1; ...; f an] を作成します。
末尾再帰ではありません。val rev_map : ('a -> 'b) -> 'a list -> 'b list
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'aList.fold_left f a [b1; ...; bn] は
f (... (f (f a b1) b2) ...) bn になります。val fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'bList.fold_right f [a1; ...; an] b は f a1 (f a2 (... (f an b) ...)) になります。
末尾再帰ではありません。val iter2 : ('a -> 'b -> unit) -> 'a list -> 'b list -> unitList.iter2 f [a1; ...; an] [b1; ...; an] は f a1 b1; ...; f an bn を順に呼び出します。
ふたつのリストの長さが異なる場合は Invalid_argument 例外が発生します。val map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c listList.map2 f [a1; ...; an] [b1; ...; bn] は
[f a1 b1; ...; f an bn] になります。
ふたつのリストの長さが異なる場合は Invalid_argument 例外が発生します。val rev_map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
val fold_left2 : ('a -> 'b -> 'c -> 'a) -> 'a -> 'b list -> 'c list -> 'aList.fold_left2 f a [b1; ...; bn] [c1; ...; cn] は
f (... (f (f a b1 c1) b2 c2) ...) bn cn になります。
ふたつのリストの長さが異なる場合は Invalid_argument 例外が発生します。val fold_right2 : ('a -> 'b -> 'c -> 'c) -> 'a list -> 'b list -> 'c -> 'cList.fold_right2 f [a1; ...; an] [b1; ...; bn] c は
f a1 b1 (f a2 b2 (... (f an bn c) ...)) になります。
ふたつのリストの長さが異なる場合は Invalid_argument 例外が発生します。
末尾再帰ではありません。val for_all : ('a -> bool) -> 'a list -> boolfor_all p [a1; ...; an] はリストのすべての要素が述語 p を満たすか検査します。
すなわち、 (p a1) && (p a2) && ... && (p an) を返します。val exists : ('a -> bool) -> 'a list -> boolexists p [a1; ...; an] はリストの要素のうち少なくともひとつは述語 p を満たすか検査します。
すなわち、 (p a1) || (p a2) || ... || (p an) を返します。val for_all2 : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool
val exists2 : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool
val mem : 'a -> 'a list -> boolmem a l は a が l の要素と等しい場合、かつその場合にかぎり真を返します。val memq : 'a -> 'a list -> boolList.mem と同じですが、リストの要素を比較するのに構造等価性ではなく、物理的等価性を使います。val find : ('a -> bool) -> 'a list -> 'afind p l はリスト l の要素で、述語 p を満たす最初のものを返します。
リスト l に p を満たす要素がない場合には Not_found 例外が発生します。val filter : ('a -> bool) -> 'a list -> 'a listfilter p l はリスト l の要素で、述語 p を満たすものをすべて返します。
入力リスト内での要素の順番は保存されます。val find_all : ('a -> bool) -> 'a list -> 'a list
val partition : ('a -> bool) -> 'a list -> 'a list * 'a listpartition p l はリストのペア (l1, l2) を返します。
ここで、 l1 は l の要素のうち、述語 p を満す要素のリストで、
l2 は l の要素のうち p を満たさないもののリストです。
入力リスト内での要素の順番は保存されます。val assoc : 'a -> ('a * 'b) list -> 'bassoc a l はペアのリスト l 内でキー a に対応する値を返します。
すなわち、 (a, b) がリスト l 内での a の最左の束縛であれば、
assoc a [...; (a, b); ...] = b になります。
リスト l 内に a に対応する値がない場合には Not_found 例外が発生します。val assq : 'a -> ('a * 'b) list -> 'bList.assoc と同じですが、キーの比較に構造等価性ではなく物理的等価性を使います。val mem_assoc : 'a -> ('a * 'b) list -> boolList.assoc と同じですが、束縛が存在した場合には単純に真を返し、与えられたキーに対する束縛がない場合には偽を返します。val mem_assq : 'a -> ('a * 'b) list -> boolList.mem_assoc と同じですが、キーの比較に構造等価性ではなく物理的等価性を使います。val remove_assoc : 'a -> ('a * 'b) list -> ('a * 'b) listremove_assoc a l はペアのリスト l から、もし存在すれば、キーとして a を持つ最初のペアを除いたものを返します。
末尾再帰ではありません。val remove_assq : 'a -> ('a * 'b) list -> ('a * 'b) listList.remove_assoc と同じですが、キーの比較に構造等価性ではなく物理的等価性を使います。
末尾再帰ではありません。val split : ('a * 'b) list -> 'a list * 'b listsplit [(a1,b1); ...; (an,bn)] は ([a1; ...; an], [b1; ...; bn]) になります。
末尾再帰ではありません。val combine : 'a list -> 'b list -> ('a * 'b) listcombine [a1; ...; an] [b1; ...; bn] は
[(a1,b1); ...; (an,bn)] になります。
ふたつのリストの長さが異なる場合には Invalid_argument 例外が発生します。
末尾再帰ではありません。val sort : ('a -> 'a -> int) -> 'a list -> 'a listArray.sort を参照してください)。
例えば、 compare は適切な比較関数です。
結果のリストの要素は昇順に整列しています。
List.sort は一定のヒープ空間(に結果のリストのサイズを加えたもの)に対数オーダーのスタック空間で実行できることが保証されています。
現在の実装ではヒープソートを使っていいます。これは一定のヒープ空間に対数オーダーのスタック空間で実行できます。
val stable_sort : ('a -> 'a -> int) -> 'a list -> 'a listList.sort と同じですが、整列アルゴリズムが安定であることが保証されています(すなわち、等しい要素の順番はもとのリスト内での前後関係が保存されるということです)。
現在の実装ではヒープソートを使っていいます。これは一定のヒープ空間に対数オーダーのスタック空間で実行できます。
val fast_sort : ('a -> 'a -> int) -> 'a list -> 'a list
val merge : ('a -> 'a -> int) -> 'a list -> 'a list -> 'a listl1 と l2 が比較関数 cmp に関して整列しているとすると、 merge cmp l1 l2 は l1 と l2 のすべての要素を含む、整列したリストを返します。
等しい要素が複数ある場合には l1 の要素が l2 の要素より先に現れます。
末尾再帰ではありません(引数のリストの長さの和に比例します)。