練習問題 4.3
次の関数 funny がどのような働きをするか説明しなさい。
# 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 $ f) (n / 2) $ f;;
val funny : (‘a -> ‘a) -> int -> ‘a -> ‘a = <fun>
(* 練習問題 4.3 *)
let id x = x;;
let ($) f g x = f (g x);;
(*
* (f$f)x = f(fx) と同じことになる。
* すなわち、n が偶数の場合、(f$f)となる。
* (n/2) がゼロになるまで、(f$f)(f$f)...となる。
* n が奇数の場合、(f$f)(f$f)...の最後に $f として、
* f がひとつ追加される。
* id とは、恒等関数である。すなわり、値なら値を、
* 関数なら関数をそのまま返す関数である。
*
* 要するに、funny 関数は、n の回数だけ、f 関数を
* 繰り返す関数を返す関数である。
*)
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 $ f) (n / 2) $ f;;
let twice x = x * 2;;
let test1 = twice 2 = 4;;
let test2 = funny twice 4 2 = 32;;
let rec aaa f n =
if n = 0 then id
else
if n mod 2 = 0
then aaa (f $ f) (n/2)
else
aaa (f $ f) (n/2) $ f;;
let bbb f n = (f $ f) (n / 2);;
(* let ccc f n = (f $ f) (n) $ f;; i*)
(* let ddd f n = (f $ f) (n / 2) $ f;; *)
let addten x = x + 10;;