オブジェクト指向について
まず、オブジェクト指向の歴史について大まかに説明します。
オブジェクト指向(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が持っている型推論の完全性はないそうです。
型を推論するのに十分な情報がない場合は
自分で型情報を与えてあげる必要があります。
型推論のページによると
コンパイラが各コンストラクトの型を推測するのに十分な情報がない場合は、
通常、コード内のどこかに明示的な型の注釈を追加することにより、追加の型情報を指定する必要があります。
とあります。
また、クラスに関する記法もOCamlとは異なっているため
オブジェクト指向の機能に関して言えば
OCamlとF#に互換性はなく、別物だと考えた方が良いと思います。
(オーバーロードについては後に説明します)
また、オブジェクト指向の利用場面について
主に.NET Framework 用のアプリケーションで使い、
オブジェクト指向のコードと密接に相互運用していない場合、
または自己完結型のコードを記述していて、オブジェクト指向のコードと頻繁にやり取りする必要がない場合は、
クラス、レコード、判別共用体の組み合わせの使用を検討する必要があります。
という風な記述が
ここのMicrosoftのドキュメントの後半部分にあります。
型推論の完全性(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