オブジェクト指向について

まず、オブジェクト指向の歴史について大まかに説明します。 オブジェクト指向(object-oriented)という単語は 1970年代に開発されたSmalltalkという プログラミング言語とともに登場しました。 開発者のAlan Kay氏は ダイナブック構想(東芝のノートPCとは直接は関係ない)や 「未来を予測する最良の方法は、自らその未来を発明することだ」 -The best way to predict the future is to invent it- の言葉で有名です。 2003年には、オブジェクト指向に関する貢献で コンピュータサイエンス分野のノーベル賞とも言える チューリング賞を受賞しています。 私はSmalltalkはさわったことがないので詳細は知りませんが SmalltalkでのOOはメッセージの送信を重視しているそうです。 よく、メッセージパッシングと呼ばれている特徴のことですね。 調べるといくつかインタビューが見つかりますが、 最近の記事では、 「オブジェクト指向という単語を使ったのは メッセージ送信の重要性を強調しきれていないという点で失敗だった」 (it was a bad choice because it under-emphasized the more important idea of message sending) と語られています。 オブジェクト指向という言葉が登場したのはsmalltalkからですが オブジェクト指向の特徴を持っている最初の言語としては Simula(1967)という言語を指すことが多いようです。 C++の開発者のBjarne Stroustrup氏は C++のオブジェクト指向はSmalltalkと同じく Simulaに影響を受けていると ホームページに記述しています。 同サイトには、Simulaの特徴として カプセル化、継承、多態性(encapsulation, inheritance, and polymorphism)が挙げてあり わりと良く耳に入るオブジェクト指向の特徴を持っているのが Simula/C++の流れをくむオブジェクト指向言語だと言えると思います。 この2つのタイプ以外にも大きく種類が異なるものとして 1980年代に開発されたSelfというプロトタイプベースのオブジェクト指向言語があります。 この言語にはクラスは登場しません 既にあるオブジェクト(プロトタイプ)をコピーして 必要であれば機能を追加する、というような使い方をします。 プロトタイプベースという用語について、 Selfのサイトには Self is a prototype-based dynamic object-oriented programming language とはっきりと記述があります。 こんな変わり種ですが、身近にもプロトタイプベースの言語があります。 JavaScriptやFlashのActionScriptなどです。 これらの言語機能の共通部分はECMAScriptとしてまとめられており 事実上ほぼ全てのブラウザが対応しているECMA-262 3rd editionによると 4.2.1にECMAScriptはプロトタイプベースの継承をサポートしている (ECMAScript supports prototype-based inheritance) と記述があります。

F#でのオブジェクト指向

さて、F#のオブジェクト指向はどうかというと Simula/C++の流れをくんでいるようで カプセル化、継承、多態といった特徴を サポートした言語機能があります。 また、F#は、C#等と同じくCLI上で動くこともあり、 .Net Frameworkとの親和性を持つように 設計されているようです。 そのため、F#はC#にもある オーバーロードによる多態をサポートしており、 これは、元の言語のOCamlには無い機能です。 ただし、トレードオフとして F#ではOCamlが持っている型推論の完全性はないそうです。 型を推論するのに十分な情報がない場合は 自分で型情報を与えてあげる必要があります。 MSDN:Type Inference (F#)によると 各構築物について、コンパイラが型を推論するための情報がない場合 コードに注釈(アノテーション)という形で追加の型情報を与える必要がある。 If there is not enough information for the compiler to deduce the types of each construct, you must supply additional type information, typically by adding explicit type annotations somewhere in the code. とあります。 また、クラスに関する記法もOCamlとは異なっているため オブジェクト指向の機能に関して言えば OCamlとF#に互換性はなく、別物だと考えた方が良いと思います。 (オーバーロードについては後に説明します) また、オブジェクト指向の利用場面について 主に.NET Framework 用のアプリケーションで使い、 それ以外の場面ではdiscriminated unionとレコードの利用も 検討してくれという風な記述がMSDNのここの後半部分にあります。
型推論の完全性(completeness)
型推論の完全性というのは
型注釈をつけて型が推論できるのであれば
常に型注釈が無くても型が推論できる、という性質のことだそうです。
これはOCamlの型システム(以下の参考文献のものがベース)の
便利な点の一つだと思います。

Robin Milner: A Theory of Type Polymorphism in Programming. J. Comput. Syst. Sci. 17(3): 348-375 (1978)

Luis Damas, Robin Milner: Principal Type-Schemes for Functional Programs. POPL 1982: 207-212