関数型とOOP

補足というかなんというか。
そもそもから言えば、関数型言語ではOOPが存在しないとは思っていないのです。SchemeにだってMLにだってオブジェクト指向はあるし、実装自体できる。Cだって、オブジェクト指向っぽく書くことはできる。だけれども、そこに破壊的代入があるべき、もしくはあったほうがよりよいのではないかと思っている、ということです。
例えばSICPにも、銀行口座オブジェクトの例があります(3章)。ここで使われているのも、id:sumiiさんが示してくださったスライドにもあるオブジェクト指向の方針です。つまり、何か状態変化があればnewをして、その新しいオブジェクトをreturnする、ということです。この方針と方法については確かにその通りで、オブジェクト指向自体は実現できると思います。でも、それって本当に効率的なのか?という疑問があるわけです。そして、オブジェクト指向の一部を無視しているのではないか、という疑問もあるわけです。
まず効率の問題として、一つの内部状態を変化させるのに、わざわざ新しいオブジェクトのnewを行うという無駄。まあ、関数型自体がそういうものだと言われれば、その通りなのですが。
そして、オブジェクト指向の一つの目的であるところの、作業の分担というところをちょっと無視しているのではないかと。つまり、内部状態が変化しているかどうかを、そのオブジェクトを使う人がきちんと把握してあげなくてはならない、という点があります。大したことは無いと思うのですが、なんか気持ちが悪い。内部状態を変化させながら値を返すようなメソッドは、存在できないとなるわけです。
で、これって不自由なんじゃないのかなあ、と。それなら最初から素直にset!なりimmutableなりを使って実装してやるのが自然だし、効率的だと思うのです。