関数型言語とオブジェクト指向

[id:lethevert:20050807:p2]で、Concurrent Cleanオブジェクト指向的な表現をする方法について述べていますが、そもそも[id:lethevert:20050731:p3][id:lethevert:20050801:p2]で書いたように、オブジェクト指向って大丈夫なの?と思っているところはあるので、オブジェクト指向にそんなにこだわっているわけではないのです。実は不要な言語パラダイムだったりして、と内心思っているくらいです。では、なぜ、関数型言語オブジェクト指向的表現をすることを考えているかというと、プログラマの移行の障壁を考えているからです。
Cのような手続き型言語プログラマ関数型言語へ移行するのは、それほど難しいことではない(関数の引数を()で囲まないことにさえ慣れれば)んじゃないかと思っています。でも、Javaのようなオブジェクト指向になれたプログラマ関数型言語へ移行するのは、苦痛を伴うのではないかと思うのです。オブジェクトのメソッドという表記法(つまり、obj.getX()という記法)になれたプログラマが、オブジェクトのない世界に来るのは抵抗がありそうで。OCamlが注目を集めているのは、その辺が理由かもしれないと思うからです。
なら、簡便法でもいいんで、CleanでJavaオブジェクト指向的記述ができることを示せば、Javaオブジェクト指向プログラマにもとっつきやすくなるのではないかなと思って、関数型言語Javaオブジェクト指向的記述をすることをあれこれと考えているのです。
また、それとは別に、Javaオブジェクト指向の方が、Cleanのような関数型言語よりも記述しやすいアルゴリズムがあるかどうかも気になっているところです。今のところ「継承」が関数型言語だとどう表現したらいいのかを考えているところです。ただ、「継承」によって、メソッド宣言をしなくても、メソッドが呼び出せるという機能は、考えようによっては、宣言なく関数が呼び出せるという気持ちの悪い機能でもあるので、不要かも知れませんが。

      • -

kwatchさんのコメントに対する返信

kwatch 『7/31および8/1の日記で、オブジェクト指向言語は関数ポインタが使えないという趣旨のことをおっしゃってますが、そんなこともないですよ。 SmalltalkRubyObjective-Cなどは関数ポインタに相当する機能(シンボルやセレクタ)があり、また関数型言語のように手続き(一連の処理)をオブジェクトとして扱うことができます。実はJavaのように関数ポインタに相当する機能がない言語のほうが少数派です。そして、両者を分けているのは「静的な型を必要とするかしないか」です。本当はJavaでもJVMを拡張すれば関数ポインタは扱えるはずなんですけどね。』 (2005/08/08 13:32)

Objective-Cについてはよく知りませんでしたが、コンパイルするタイプの言語なのに、動的な型付けができるのですね。CLEANのDynamicsみたいな感じなのかな?
それはともかく、当初、ちょっとした思い付きで書いたエントリーが、これだけいろいろコメントがついて、議論が進んでくると、言葉の定義や前提条件がはっきりしていないことで、多くの誤解が生まれるようで。
オブジェクト指向といったときに、それが何を指しているのかは、非常にあいまいだということは、皆さん、理解していることだと思っています。その上で、僕が「オブジェクト指向言語」といったときに念頭においていたのは、Javaであり、C++Delphiだったのです。静的型付け言語で、オブジェクト=抽象データ型であり、利用者の多いものを意図していました。
なぜ、オブジェクト指向関数型言語を比較したのかというと、OCamlが、関数型言語オブジェクト指向を実装しているのですが、その実装方法がしっくりと来なかったので、関数型言語パラダイムオブジェクト指向パラダイムにはどのような差異があるのか、もっと違和感の少ない融合方法はないのか、ということを考えたかったからです。
関数ポインタというか、関数型については、オブジェクト指向でも使えるものはありますけど、それを言ったら、クロージャとかアスペクト指向とか総称型とかいろいろあるので、とりあえず、メジャーなオブジェクト指向言語に限定した話で話を進めていたのでした。