プログラミング in OCaml 4th chapter 練習問題を解いた

練習問題 4.1

let uncurry f (x, y) = f x y;;

練習問題 4.2

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 (f, s) -> (s, f + s)) n (0, 1)
  in fibn;;

練習問題 4.3

let rec funny f n =
  if n = 0 then id
  else if n mod 2 = 0 then funny (f $ f) (n / 2)
  else (funny f (n - 1)) $ f;;

nの数だけ fを関数合成させる動きをしてるっぽい、証明はめんどいからパス

練習問題 4.4

(*
s k k 1
-> k 1 (k 1)
-> k 1 (<fun>)
-> 1
*)

練習問題 4.5

パス

練習問題 4.6

let k x y = x;;
let s x y z = x z (y z);;
let cdr x y = k (s k k) x y;;