流行りの関数型言語を勉強中(2)

挿入ソート

教科書の中の問題の解答。
例題をこなせば、それなりに作れるようになるようです。

(* 目的:あらかじめ昇順に並んでいる整数リスト(lst)と整数nを受け取ったら
 * 昇順となる位置にnを挿入したリストを返す関数 *)
(* insert: int -> int list -> int list *)
let rec insert n lst = match lst with
                [] -> [n]
                | first::rest -> if first >= n then  n :: first ::rest
                                 else first :: insert n rest (* rec *)

(* 目的:整数リスト(lst)を昇順にソートする(挿入ソート) *)
(* ins_sort int list -> int list *)
let rec ins_sort lst = match lst with
                [] -> []
                | first :: rest -> insert first (ins_sort rest) (* rec *)

(* テスト *)
let test1 = insert 1 [] = [1]
let test2 = insert 1 [0] = [0; 1]
let test3 = insert 3 [1; 2; 4; 5] = [1; 2; 3; 4; 5]
let test4 = insert 5 [1; 2; 3; 4] = [1; 2; 3; 4; 5]
let test5 = insert 5 [1; 10] = [1; 5; 10]
let test6 = insert 3 [1; 2; 3; 4] = [1; 2; 3; 3; 4]

let test7 = ins_sort [3; 1; 2] = [1; 2; 3]
let test8 = ins_sort [] = []
let test9 = ins_sort [5] = [5]
let test10 = ins_sort [5; 4; 3; 2; 1] = [1; 2; 3; 4; 5]
let test11 = ins_sort [1; 2; 4; 3] = [1; 2; 3; 4]