遅延評価

昨日([id:lethevert:20051123:p5])は眠かったせいか、何を言いたいのかよく分からないことを書いていたようだ。
要は、遅延評価が現実的に有効かどうかを考えたかった(のだと思う)のだが、
[id:lethevert:20050912:p2]
の時にも思ったのだけれど、遅延評価は使いようで、かなり有用なプログラミングツールになりそうだと思っているのだ。
たぶん、基本的な使い方は、こんな形になると思う。

mainFunction
    = doProcedure
where
    data = data
    where
        data = ... //ここで、計算に必要なデータを*全て*記述する。

    doProcedure
        = ... //上で定義したdataを利用して、*計算や処理のみ*を記述する。

たとえば、wgetを作るなら、遅延評価を使えば、理想的にはこんな風に書けるはず。

// Webはリンクでつながった再帰的な構造をしたデータとして表現される
Web = Web WebPage [Web]
getWeb page = WebPage page (map getWeb pages) where pages = getLinkedPages page // wgetの本体 wget firstpage = saveWeb web 0 where // Webのデータを、無限に再帰的なデータとして、先に宣言しておく www = getWeb firstpage // 宣言されたデータを使って、wgetの処理を書く。(下のコードは嘘だが、雰囲気だけつかんでくれ) saveWeb MAXDEPTH _ = done saveWeb depth (Web page links) # printWebPage page = map (saveWeb (depth+1)) links

ただ、上のようなコードを書こうとしたときには、Webアクセスが入出力であって副作用が発生することが問題になる。
多分、Haskellじゃ、全ての処理をモナド内で完結させなければいけないから、無理だと思う(よく分からない。嘘かも)けど、Concurrent Cleanの一意型を使えば、もしかして、書けるかな?
ということで、そのうち、検証してみようと思う。