NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

Re: relatively prime

差出人: Jun Mukaiさん
送信日時 2004/01/10 00:01
ML.NO [ocaml:0036]
本文:

向井です.

> いま頭がぼーっとしているので原因は分りませんが、この例外は lazy
> value の値が自分自身の値に依存している時に起きます。

こんな感じでしょうか?
# let rec a = lazy(Lazy.force a);;
val a : 'a Lazy.t = <lazy>
# Lazy.force a;;
Exception: Lazy.Undefined.

なるほど.となると,
let rec ss = lazy((false @: true @: (cycle (of_a false))) @:
(map (fun n -> map (nth n) (cycle (take n (Lazy.force ss))))
(from 1)));; ~~~~~~~~~~~~~

ここが問題になるわけですね.
おそらく,下線部の force で ss を展開しようとすると,そこで map を参照
して自身を展開しようとしてしまうために例外が発生するのでしょう.となれ
ば,この map の評価を lazy にすれば動くように思います.

let rec ss = lazy((lazy(false @: true @: (cycle (of_a false)))) @:
(map (fun n -> lazy(map (fun m -> nth n (Lazy.force m))
(cycle (take n (Lazy.force ss))))) (from 1)));;

かなりわけわからんと思いますが(lispみたい), ss は bool Lseq.seq
Lazy.t Lseq.seq Lazy.t 型になっています.

これで試してみると,
# #use "rprime.ml";;
# open Lseq;;
# nth 10 (nth 10 (Lazy.force ss));;
- : bool = false
# nth 11 (nth 10 (Lazy.force ss));;
- : bool = true
# nth 9 (nth 10 (Lazy.force ss));;
- : bool = true
# nth 8 (nth 10 (Lazy.force ss));;
- : bool = false

というように,ちゃんと動いているようです.

ありがとうございました.

添付:
 読み込み中...

このメールは下記のメールに対する返信です:

【PR】壁紙メーリスブログ無料ホームページゲーム