毛の壁以降、色んなところであーだこーだ再定義言われてるけど、結局名前が悪いんだよなぁ。
どちらかというとオブジェクト指向の方が「何もかもサブルーチン(ただし値を覚えていてくれるおまけつき)」で、関数型の方が「何もかもが値(関数も)」なんだけど、まず名前からだと逆っぽく聞こえる。
加えて、この二つの概念が対立すると思われてしまうけれど、んなこたーないのはjavascript見れば分かる。何もかも値かつサブルーチン、でOK。
両立しにくいのは、オブジェクトの概念と高階関数の概念ではなく、オブジェクト指向言語が採用してきた型システムと、関数型言語が採用してきた型システムだ。
つまりC++やらJavaやらが採用してきたサブタイプ多相をベースにしたクラスによる型付けと、ML系言語が採用してきた代数的データ型が噛み合わない。致命的に。
いやまぁScalaは頑張って統合したけど、コンパイル遅いわ書き方次第で型チェックが無限ループになるわで、色々と無茶しやがって感ある。