42

私の質問は、StandardMLのモジュールシステムとOCamlモジュールシステムの間に違いがあるかどうかです。OCamlはSMLが持っているファンクター、アクリプションなどのすべてのサポートを持っていますか?

4

3 に答える 3

56

機能的にも意味的にもいくつかの違いがあります。

機能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の間の関係に関する情報を失っています。これは、一般に、表面構文では表現できないためです。uv

もう1つの注目すべき違いは、SMLが許可していない抽象署名の許可のために、OCamlのモジュール型システムが決定不能である(つまり、型チェックが終了しない可能性がある)ことです。

于 2013-03-23T09:50:50.373 に答える
2

セマンティクスに関しては、上記のAndreasRossbergによってはるかに優れた精巧な答えが与えられています。ただし、構文に関しては、このサイトがあなたが探しているものかもしれません。

于 2013-03-23T08:38:32.577 に答える
0

SMLには、データ型の構造を隠すことを除けば、データ型機能に似たabstype機能もあります。OCamlは、モジュールの抽象化に依存して、必要なすべての隠蔽を行います。このサイトはSMLでこの機能について言及していないことに注意してください。

于 2019-08-13T10:41:56.193 に答える