F# メモ List (2)
リスト関数
| 関数 関数の型 |
簡単な説明 |
| 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"]
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
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
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 |
指定された関数を、リストの各要素に対して順次実行する関数。

rei@sikios.com
コメントはまだありません。