第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に値を追加する機能もつけてきてほしいらしいです。

   1 let cons data (ls : stream) = …;;
   2 let ls = unfold …;;
   3 let ls = cons 1 ls;;
   4 head ls;; (* この式の結果が1となればいい。 *)


Categoryノート