//高階関数に渡すための関数を定義
> let add1 x = x + 1;;
val add1 : int -> int
//List.mapはリストに対するmap関数
//List[1..10]の要素全てに1を加算した結果を返す関数
> List.map add1 [1..10];;
val it : int list = [2; 3; 4; 5; 6; 7; 8; 9; 10; 11]
//ちょっとした関数:匿名関数の利用
> List.map (fun x -> x+1) [1..10];;
val it : int list = [2; 3; 4; 5; 6; 7; 8; 9; 10; 11]
//ちょっとした関数:カリー化した関数の利用
> List.map ((+)1) [1..10];;
val it : int list = [2; 3; 4; 5; 6; 7; 8; 9; 10; 11]
//List.mapの結果はリストなので、重ねて利用可能([1..10]に対して2*(x+1)を計算))
> List.map (( * )2) (List.map ((+)1) [1..10]);;
val it : int list = [4; 6; 8; 10; 12; 14; 16; 18; 20; 22]
//fの戻り値は、別の型でもOK。タプルのリストを生成
> List.map (fun x -> (x,10-x)) [1..3];;
val it : (int * int) list = [(1, 9); (2, 8); (3, 7)]
//上記をちょっと応用:mapを組み合わせた順列の生成
> let junretu lst = List.map (fun x -> List.map (fun y -> (x,y)) lst) lst;;
val junretu : 'a list -> ('a * 'a) list list
> junretu [1..3];;
val it : (int * int) list list
= [[(1, 1); (1, 2); (1, 3)]; [(2, 1); (2, 2); (2, 3)];
[(3, 1); (3, 2); (3, 3)]]
//シーケンス式でも同じことができます
> let junretu2 lst = [for i in lst -> [for j in lst -> (i,j)]];;
val junretu2: lst: seq<'a> -> ('a * 'a) list list
> junretu2 [1..3];;
val it: (int * int) list list =
[[(1, 1); (1, 2); (1, 3)]; [(2, 1); (2, 2); (2, 3)];
[(3, 1); (3, 2); (3, 3)]]