実は、TypeもClassもその意図は同じである。
finalventの日記 - ぶくまより オブジェクト指向とかあと、関数型言語っていうか、そういうのがOOPとどういう関係にあるのか、どうもすっきりしない。関数で表現できるならクラスとか要らないのでは?というか、ま、このあたりはよくわからない。
404 Blog Not Found:オブジェクトは難しくない。難しいのはクラス
それで、オブジェクトとは何か、といえば、「自分が何が出来るのかを知っているデータ」ということになる。
そして、型がある言語における関数が何かといえば、「自分がどんなデータを受け付けるのかを知っているサブルーチン」ということになる。CからHaskellまで、これに例外はない。
だから、「犬が吠える」と言った時に、「犬」に注目するのがオブジェクト指向で、「吠える」に注目するのが「サブルーチン指向」とも言える。「名詞指向」と「動詞指向」といってもいいかも知れない。
ひょっとして、オブジェクト指向がサブルーチン指向の後に来たのは、電脳科学の研究が主に英語で進んだことも大いに影響しているのではないか。英語はかなり動詞指向で、プログラムにおける語順もprint "Hello, world"
と英語のまま。これがオブジェクト指向だとたいていは"Hello, world".print
となる。もちろんそのまえにForthとかあったけど、それほどメジャーにならなかったのはこのこともあるかも知れない。今じゃ英語圏のプログラマーだってnew URI('http://www.perl.org/')
でなくてURI->new('http://www.perl.org/')
とやって違和感を感じることはないのに。
閑話休題。それで、タイプ(型)とクラスだけど、実はこの両者は、「対象を絞る」という点においては全く同じ機能を持っている。Cのtypedef
がC++のclass
に「進化」したのも、PerlのPackageが、blessed referenceを加えるだけでそのままクラスになってしまったのも、いかにこの二つが似通っているかを示している。
で、なぜ「対象を絞る」がありがたく、そしてプロジェクトが大きくなればなるほどありがたみが増すかといえば、我々は動詞、すなわちサブルーチン、すなわちメソッドに対しては、名詞、すなわちデーター、すなわちオブジェクトよりも多義性をずっと強く期待しているからだ。我々は、同じcastでも、それが俳優をcastするのか鋳物をcastするのかでcastの方法はまるで変わってくるが、どちらに対してもcastという言葉を使いたいのである。
ところが、Cあたりまでは、いちいちどんなデータが来るかに応じて関数の名前を使い分けていたのだ。compare
でなくてstrcmp
、copy
でなくてstrcpy
というわけである。しかもstrcpy
に至っては、引数はfrom, to
ではなくてto, from
である。そのあげくにgethostbyname
である。よくCだけでUnixを書き上げたものだと関心してしまう。私がPHPを仕事で使う気になれないのは、21世紀になってもAnimaliaChordataMammaliaPrimataHomonidaeHomoSapiens()
みたいなことを平気で強いるからである。
これがオブジェクト指向なら、array.copy()
でもstring.copy()
でもどちらもcopy
という動詞を使えるし、型推論(type inference)があればcompare(array, anotherarray)
もcompare(string, anotherstring)
も同じようにcompare
という動詞を使える。型推論は実はHaskellの専売特許ではなく(あれば一番elaboratedだけど)Javaにもあって、それ証拠にArrays (Java 2 Platform SE v1.4.2)あたりを見ただけで、binarySearch
やsort
がたくさんある。引数の型に応じて適切なsort
が呼ばれるというわけだ。もちろんPerl 6はどちらも出来るようになる予定だ。ただし、動的な型を持つPerl 6の場合は、型推論は結構難しくて、この仕様を固めるのにえらい苦労をしていたけど。
結論としては、オブジェクト指向に見える手続き型言語(i.e. perl)も、手続き型言語のように見える(魅せることが出来る)オブジェクト指向言語(i.e. ruby)もどちらも可能で、どちらも実はそれほど違いはないということ。これはプログラムもデータであるというTuring的なパラダイムと、データもプログラムであるというChurch的なパラダイムが実は同じことだったというのに似た感動がある。この感動を味わった人なら、もうどっちを使うかというのは趣味の問題なのではないか。
Dan the Typo, ahem, Type Generator