リスト関数

関数
関数の型
簡単な説明
List.length
‘a list -> int
要素の数を取得する
List.head
‘a list -> ‘a
先頭の要素を取得する
List.tail
‘a list -> ‘a list
先頭の要素を除いたリストを取得する
List.exists
(‘a -> bool) -> ‘a list -> bool
条件に合う要素が存在するか調べる
List.rev
‘a list -> ‘a list
順番を逆にしたリストを取得する
List.tryFind
(‘a -> bool) -> ‘a list -> ‘a option
条件に合う要素を取得する
存在しない場合はNoneを返す
List.zip
‘a list -> ‘b list -> (‘a * ‘b) list
2つのリストの要素を組み合わせ、
タプルのリストを作成する
List.filter
(‘a -> bool) ‘a list -> ‘a list
条件に合う要素のみを含むリストを作成する
List.partition
(‘a -> bool) -> ‘a list -> (‘a list * ‘a list)
条件に合う要素のみを含むリストと
それ以外のリストのタプルを作成する

他にも多数あります。msdn


集約関数 (Aggregate Operators)

リストなどのコレクションには個々の要素に対して何らかの操作を行う関数が多数用意されている。

List.map
(‘a -> ‘b) -> ‘a list -> ‘b list

‘a -> ‘b 変換関数をすべての要素に適用し、’b list を作成する。

例:整数のリストを基に、文字列のリストを作成する。

> let tostr x = sprintf "%d" x
let a = [1..10]
let b = List.map tostr a;;

val tostr : int -> string
val a : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
val b : string list = ["1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"]

List.reduce
(‘a -> ‘a -> ‘a) ->’a list -> ‘a

リストの要素を辿りながら ‘a 型のアキュムレータを構築していく関数。
(‘a -> ‘a -> ‘a) の部分は現在のアキュムレータとリストの要素を引数とし、新たなアキュムレータを作成する関数。

例:1から5までの整数の積を求める。(ついでに、アキュムレータの確認を行う)

> let multiple a b =
    printfn "// %3d = %2d * %d" (a*b) a b
    a * b
let b = List.reduce multiple [1..5];;
//   2 =  1 * 2
//   6 =  2 * 3
//  24 =  6 * 4
// 120 = 24 * 5

val multiple : int -> int -> int
val b : int = 120

上の例のように、リストの先頭要素がアキュムレータの初期値となる。


List.fold
(‘acc -> ‘b -> ‘acc) -> ‘acc -> ‘b list -> ‘acc

リストの要素を辿りながら任意の型のアキュムレータを構築していく関数。
List.reduceを汎用的にしたもの。
アキュムレータの初期値を与える必要がある。

例:リスト中の文字数の合計を取得する

> let Count acc (str:string) = acc + str.Length
let dow = [
    "Sunday";
    "Monday";
    "Tuesday";
    "Wednesday"
]
let total = List.fold Count 0 dow;;

val Count : int -> string -> int
val dow : string list = ["Sunday"; "Monday"; "Tuesday"; "Wednesday"]
val total : int = 28

List.iter
(‘a -> unit) -> ‘a list -> unit

指定された関数を、リストの各要素に対して順次実行する関数。