OCaml初体験

(*原始帰納的関数*)
(*零関数*)
let zero x = 0;;
(*後者関数*)
let suc x = x + 1;;
(*射影関数*)
let p n i = function x -> x.(i - 1);;
(*前者関数*)
let pred = function
    0 -> zero ()
  | x -> p 2 1 [|(x - 1); pred (x - 1)|];;

(*加算*)
let rec add x = function
    0 -> x
  | y -> suc (add x (y - 1));;
(*減算*)
let rec sub x = function
    0 -> x
  | y -> pred (sub x (y - 1));;
(*乗算*)
let rec mult x = function
    0 -> zero ()
  | 1 -> x
  | y -> add x (mult x (y - 1));;

(*高橋正子「計算論」P16 問1.3.5*)
(*累乗*)
let rec exp x = function
    0 -> 1
  | 1 -> x
  | y -> mult x (exp x (y - 1));;
(*べき乗*)
let rec fact = function
    0 -> 1
  | 1 -> 1
  | x -> mult x (fact (x - 1));;
(*大きい数を出力*)
let max x y =
  if((sub x y) > 0) then x else
    y;;
(*小さい数を出力*)
let min x y =
  if((sub x y) < 0) then x else
    y;;

(*高橋正子「計算論」P16 問1.3.6*)
let rec fs x =
  let f x = add x 2 in
  function
	  0 -> x
	| 1 -> f x
	| y -> f (fs x (y - 1));;

 一応ここまでなら頭の中で分かってたことだけど、実際にプログラムとして書いてみるとなんか壮快。というか、OCamlの記述が結構イカしてるっていう単純な理由だけど。

計算論 計算可能性とラムダ計算
高橋 正子
近代科学社
売り上げランキング: 12623
おすすめ度の平均: 5.0
5 入門書として最高の一冊
 ってかこの本、「入門に最適」って書いてあるけど、相当ムズい。あ、俺が頭悪いだけか。