宿題

Exercise 6   次の関数 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>

fをn回適用した関数を返す高階関数。repeatと同じ働きをする。

次のようにすると、どのような働きをするかがわかりやすい。

# let add1 x = x + 1;;
val add1 : int -> int = <fun>
# let add3 = funny add1 3;;
val add3 : int -> int = <fun>
# add3 5;;
- : int = 8
# add3 1;;
- : int = 4
#
# let add5 = funny add1 5;;
val add5 : int -> int = <fun>
# add5 5;;
- : int = 10
# add5 15;;
- : int = 20
let add5 = funny add1 5
         = funny (add1 $ add1) (5 / 2) $ add1 
         = funny (add1 $ add1) 2 $ add1
         = funny ( (add1 $ add1) $ (add1 $ add1)) (2 / 2) $ add1
         = funny (add1 $ add1 $ add1 $ add1) 1 $ add1
         = funny ( (add1 $ add1 $ add1 $ add1) $ (add1 $ add1 $ add1 $ add1)) (1/2) 
           $ (add1 $ add1 $ add1 $ add1) $ add1
         = funny ( (add1 $ add1 $ add1 $ add1) $ (add1 $ add1 $ add1 $ add1)) 0 
           $ (add1 $ add1 $ add1 $ add1) $ add1
         = id $ (add1 $ add1 $ add1 $ add1) $ add1
         = add1 $ add1 $ add1 $ add1 $ add1