プログラミング in OCaml #7

プログラミング in OCaml (目次) - kengpong

(* 練習問題 4.1 uncurry を定義 *)
let curry f x y = f (x, y);;
let average (x, y) = (x +. y) /. 2.0;;
let curried_avg = curry average;;

let uncurry f (x, y) = f x y;;
let avg = uncurry curried_avg in avg (4.0, 5.3);;

(* 練習問題 4.2 repeat を使って fib を定義 *)
let rec repeat f n x =
    if n > 0 then repeat f (n - 1) (f x) else x;;

let fib n =
    let (fibn, _) =
        repeat (fun (x, y) -> (x + y, x)) n (0, 1)
    in fibn;;

(* 練習問題 4.6 関数 fun x y -> y を コンビネータ s と k を組合せて表現 *)
let f x y = k (s k k) x y;;

うーん、だんだん難しくなってきたなー。
4.6 は全くわからなかったのでカンニング
答え見てもパッと見だと全くわからないところが面白い