私の質問は、StandardMLのモジュールシステムとOCamlモジュールシステムの間に違いがあるかどうかです。OCamlはSMLが持っているファンクター、アクリプションなどのすべてのサポートを持っていますか?
3 に答える
機能的にも意味的にもいくつかの違いがあります。
機能SMLはサポートしますがOCamlはサポートしません:
- 透明な署名の帰属
- モジュールレベル
let
- 対称共有の制約
- タイプと値に対するファンクターのシンタックスシュガー
機能OCaml4にはSMLがありますが、SMLはありません。
- 高階関数
- 再帰モジュール
- ローカルモジュール
- ネストされた署名
- ファーストクラスの値としてのモジュール
- 一般的なモジュール共有(
sig with module A = M
) module type of
ただし、いくつかのSML実装では、これらの一部が拡張機能として提供されます。たとえば、高階関数(SML / NJ、Moscow ML、Alice ML)、ローカルおよびファーストクラスのモジュール(Moscow ML、Alice ML)、モジュール共有(SML / NJ、 Alice ML)、ネストされた署名(Moscow ML、Alice ML)、および再帰モジュール(Moscow ML)。
意味論的には、最大の違いは、特にファンクターに関して、型の同等性の扱いにあります。
SMLでは、ファンクターは生成的です。つまり、同じファンクターを同じ引数に2回適用すると、常に新しい型が生成されます。
OCamlでは、ファンクターは適用可能です。つまり、まったく同じ引数に同じファンクターを2回適用すると(さらに構文上の制限が追加されます)、同等のタイプが再現されます。このセマンティクスはより柔軟ですが、抽象化を破ることもあります(たとえば、このペーパーのセクション8で示した例を参照してください)。
編集:OCaml 4は、オプションでファンクターを生成する機能を追加しました。
OCamlには、純粋に構文的な署名の概念があります。つまり、特定の型の同等性は型システムでは表現できず、黙って削除されます。
編集:この例を考えてみましょう:
モジュールF(X:sig type t end)= struct type u=Xt->ユニットタイプv=Xt end モジュールM=F(構造体タイプt = int end:sigタイプt end)
の型
M
は単純であり、したがって、その型とsig type u type v end
の間の関係に関する情報を失っています。これは、一般に、表面構文では表現できないためです。u
v
もう1つの注目すべき違いは、SMLが許可していない抽象署名の許可のために、OCamlのモジュール型システムが決定不能である(つまり、型チェックが終了しない可能性がある)ことです。
セマンティクスに関しては、上記のAndreasRossbergによってはるかに優れた精巧な答えが与えられています。ただし、構文に関しては、このサイトがあなたが探しているものかもしれません。
SMLには、データ型の構造を隠すことを除けば、データ型機能に似たabstype機能もあります。OCamlは、モジュールの抽象化に依存して、必要なすべての隠蔽を行います。このサイトはSMLでこの機能について言及していないことに注意してください。