第7回
課題7
載せていいのか微妙な気もしますが、EXISTモジュールの定義は下の通り。
1 module EXIST: functor (T : sig type 'a t end) ->
2 sig
3 type t
4 type 'b u = {f : 'a. 'a T.t -> 'b}
5 val pack : 'a T.t -> t
6 val unpack : t -> 'b u -> 'b
7 end =
8 functor (T : sig type 'a t end) ->
9 struct
10 type 'b u = {f: 'a. 'a T.t -> 'b}
11 type t = {t: 'false_t. 'false_t u -> 'false_t}
12 let rec pack (x: 'a T.t) = {t = fun x1 -> x1.f x}
13 let rec unpack x f = x.t f
14 end;;
これを使って、unfoldやらheadやらを作っていくわけですが、作った関数は多分下のように使います。(無限長の素数を作っています。)
# let rec find_prime n = (* n以上の最小の素数を返す *) let rec check_prime n i = if n mod i = 0 then false else if n < i * i then true else check_prime n (i + 1) in if check_prime n 2 then n else find_prime (n + 1);; val find_prime : int -> int = <fun> # let primes = unfold (fun x -> Cons (x, find_prime (x + 1))) 2;; (* 2という数を始点として無限長の長さの素数列を作る *) val primes : stream = <abstr> # head primes;; (* primesは[2;3;5;7;11;13;・・・]のようになっているはず。リストの先頭から順に見ていく *) - : int = 2 # head (tail primes);; - : int = 3 # head (tail (tail primes));; - : int = 5 # head (tail (tail (tail primes)));; - : int = 7 # head (tail (tail (tail (tail primes))));; - : int = 11 # head (tail (tail (tail (tail (tail primes)))));; - : int = 13 # head (tail (tail (tail (tail (tail (tail primes))))));; - : int = 17 # head (tail (tail (tail (tail (tail (tail (tail primes)))))));; - : int = 19 # head (tail (tail (tail (tail (tail (tail (tail (tail primes))))))));; - : int = 23
また、レジュメにはありませんでしたが、streamに値を追加する機能もつけてきてほしいらしいです。