純粋関数型とオブジェクト指向

純粋関数型とオブジェクト指向はやっぱダメなんじゃないかと思うこの頃です。オブジェクト指向をなんと解釈するかによってなんとでもなるので、かみ合った議論がしにくいですが。
こう考えるのは、SICPの影響だと思うのですが、純粋関数型とオブジェクト指向は「状態」を扱う際のアプローチに根本的な違いがあって、根源的なところで整合性が取れないのではないかと思っています。つまり、オブジェクト指向では、状態をオブジェクトの内部に持ち、代入によって書き換えることで状態の変化を表現するのに対し、純粋関数型では、状態の推移をストリーム(遅延リスト)として表現して、代入の存在を認めていないことの折り合いがどうつくのか、つける必要があるのかが分からないのです。
Haskellモナドは、一見副作用があるっぽいですが、あれはそんな風に見える構文であるだけですし、Concurrent Cleanの一意性もそれは同じ。見た目をオブジェクト指向っぽくしても、それはただの見かけだけでしかないのではないかと思います。
ただ、もうちょっと考え中。

      • -

ただし、関数型とオブジェクト指向なら、特に相性の問題はないのではないかと。

http://www.cs.ru.nl/にアクセスできない件

プロバイダに問い合わせて、いろいろやりとりしていたのだが、「IPアドレスを直接入力してもアクセスできない」と何回も説明しているのに「DNSサーバーに異常はありませんでした」みたいな回答が返ってくる_| ̄|○
プロバイダなんだから、障害受付の担当者にネットワークの基礎くらい勉強させておいてくれ。頼むから。
結局埒があかないので、tracertで応答がなくなるところの管理者に、直接メールした。
http://www.surfnet.nl/

Concurrent Clean : アキュームレータ

[id:sumim:20060327:p1]のコメント欄で、代入の件で勘違いした件について、そういう時は、Cleanはどう書くのかを考えてみました。

Start w = w --> stdio
            --> \(f,w) = f --> printAc 1
                           --> flip fclose w
                           --> snd

printAc n f = f --> (n --> (+) 2
                       --> (+) 3
                       --> (+) 5
                       --> (+) -10
                       --> fwritei)
                --> fwrites "\n"

これで用は足りるかな?
計算途中で出力をしたい場合はこうかな?

printAc n f = (n,f) --> ac 2   --> fwriteiln
                    --> ac 3   --> fwriteiln
                    --> ac 5   --> fwriteiln
                    --> ac -10 --> fwriteiln
                    --> return
  where
    ac i (n,f) = (i+n,f)
    fwriteiln (i,f) = (i, f --> fwritei i --> fwrites "\n")
    return (_,f) = f