本文中でもふれたように,ref型は以下のように定義された,1フィールドの書き換え可能な レコードです。
type 'a ref = { mutable contents : 'a };;関数 ref,前置演算子 !,中置演算子 := の定義をレコードに関連した操作で書きなさい。
こうかな。
let ref x = { contents = x };;
let (!) x = x.contents;;
let (:=) x v = x.contents <- v;;
takatoh's blog – Learning programming languages.
本文中でもふれたように,ref型は以下のように定義された,1フィールドの書き換え可能な レコードです。
type 'a ref = { mutable contents : 'a };;関数 ref,前置演算子 !,中置演算子 := の定義をレコードに関連した操作で書きなさい。
こうかな。
let ref x = { contents = x };;
let (!) x = x.contents;;
let (:=) x v = x.contents <- v;;
与えられた参照の指す先の整数を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
参照と繰り返しの構文(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