関数のネスト

関数呼び出しの結果を、他の関数に渡すこと(関数のネスト、入れ子)で
シンプルな関数を組み合わせて、全体として複雑な処理を簡単に行うことが出来る。

整数のリストを受けとったら、それを昇順にして返す関数(挿入法)

(* 整数リストと整数nを受けとったら、昇順となる位置に整数nを挿入する *)
(* insert : int list -> int -> int list *)
let rec insert lst n = match lst with
        [] -> [n] 
        | first :: rest ->  
                if first < n then first :: insert rest n
                else n :: lst 


(* 整数リストを受けとったら、昇順にして返す *)
(* ins_sort : int list -> int list *)
let rec ins_sort lst = match lst with
        [] -> []
        | first :: rest -> insert (ins_sort rest) first

(* テスト *)
let test1 = ins_sort [2; 4; 6; 8; 1] = [1; 2; 4; 6; 8]
let test2 = ins_sort [1; 4; 6; 8; 1] = [1; 1; 4; 6; 8]
let test3 = ins_sort [4; 3; 2; 1] = [1; 2; 3; 4;] 
let test4 = ins_sort [1; 2; 3; 4] = [1; 2; 3; 4;] 
let test5 = ins_sort [2] = [2] 
let test6 = ins_sort [] = []

局所変数定義

一度、計算した値をとっておいて、再度利用する場合は局所変数を使う。
以下の例では、式1の定義は式2の中でのみ有効になる。(変数のスコープは式2のみである。)

let 変数 =1 in2

# let x = 2 in x * x ;;
- : int = 4

スコープの確認

# let x = 3 ;;
val x : int = 3
# let x = 2 in x * x ;;
- : int = 4
# x + 3 ;;    (* 局所変数として定義したxとは別 *)
- : int = 6