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の記述が結構イカしてるっていう単純な理由だけど。
計算論 計算可能性とラムダ計算
posted with amazlet on 07.02.19
おすすめ度の平均:
入門書として最高の一冊