練習問題8.1

本文中でもふれたように,ref型は以下のように定義された,1フィールドの書き換え可能な レコードです。

type 'a ref = { mutable contents : 'a };; 

関数 ref,前置演算子 !,中置演算子 := の定義をレコードに関連した操作で書きなさい。

こうかな。

let ref x = { contents = x };;
let (!) x = x.contents;;
let (:=) x v = x.contents <- v;;

練習問題8.2

与えられた参照の指す先の整数を1増やす関数 incr を定義しなさい。

# let incr x = x := !x + 1;;
val incr : int ref -> unit = <fun>
# let x = ref 3;;
val x : int ref = {contents = 3}
# incr x;;
- : unit = ()
# !x;;
- : int = 4

練習問題8.4

参照と繰り返しの構文(while,for)を使ってフィボナッチ数を求める関数を定義しなさい。

# let fib n =
let fibs = ref (1, 1) in
let i = ref 1 in
while !i < n do
fibs := (snd !fibs, fst !fibs + snd !fibs);
i := !i + 1
done;
snd !fibs
;;
val fib : int -> int = <fun>

初項を第0項とした。

# fib 0;;
- : int = 1
# fib 1;;
- : int = 1
# fib 2;;
- : int = 2
# fib 3;;
- : int = 3
# fib 4;;
- : int = 5
# fib 5;;
- : int = 8
# fib 6;;
- : int = 13