YAMAGUCHI::weblog

噛み付き地蔵に憧れて、この神の世界にやってきました。マドンナみたいな男の子、コッペです。

Objective Caml 入門 手習い(7章)その1

演習問題がある章はこれでおしまい。

Exercise 1

問題

Exercise1 ref 型の値の表示を見て気づいている人もいるかもしれないが,ref 型は 以下のように定義された1フィールドの更新可能なレコードである.
type 'a ref = { mutable contents : 'a };;

自分の答え
type 'a ref = { mutable contents : 'a };;

let ref' x = { contents = x };;
let ex x = x.contents;;
let subst x y = x.contents <- y;;

Exercise 2

問題

Exercise2 与えられた参照の指す先の整数を1増やす関数 incr を定義せよ.

自分の答え
let incr x = x := (!x + 1);;

Exercise 3

問題

Exercise3 以下で定義する funny_fact は再帰的定義(rec)を使わずに階乗を計算している. どのような仕組みで実現されているか説明せよ.

自分の答え
let f = ref (fun y -> y+1)
let funny_fact x =
  if x = 1 then 1
  else x * (!f (x-1))
;;

f := funny_fact;;
(* f = ref funny_fact となっているので !f = funny_fact *)
funny_fact 5;;