SMLとOCamlの違いは何ですか?[閉まっている]


99

2つのML方言の違いは何ですか?


3
構文比較:adam.chlipala.net/mlcomp
nawfal

回答:


157

技術的にも社会政治的にも、多くの違いがあります。私はもっ​​と重要な違いを最初にしようとしました。

  • SMLは、定義と標準を備えた言語です。安定しています(実際には凍結されているため、進化することはできません)。Objective Camlは、INRIAの小さなグループによって制御される実装です。それは進化し続けています。(IMOの進化はうまく管理されています。)

  • SMLには多くの実装があります。Camlには1つしかありません。

  • Objective Camlにはいくつかの追加機能があり、その中で最も顕著なのはおそらくオブジェクトと多態性バリアントです。

  • 2つの言語では、レコードタイプのモデルが劇的に異なります。簡単に言えば、Camlでは、レコードフィールドの名前は一意である必要があります。SMLでは、同じスコープ内の2つの異なるレコードタイプが共通のフィールド名を持つ場合があります。この癖により、SMLからCamlへの移植が少し難しくなる場合があります。

  • かなりの構文上の違いがあります。

  • ライブラリと標準関数は劇的に異なります。Camlライブラリは非常に不可欠ですが、SML標準ベーシスライブラリはより機能的です。たとえば、関数構成はSMLのトップレベルのプリミティブです。Camlライブラリの一部ではありません。Caml文字列ライブラリは、fold関数を提供していません(少なくともバージョン3.08以降)。Caml List関数の多くの実装は、非常に長いリストに対して安全ではありません。彼らはスタックを爆破します。

  • 型システムは微妙に異なります。Camlでは、型e : tyがの型とty 統一されている場合、式の型注釈が受け入れられeます。SMLではe : ty、タイプtyがのタイプのインスタンスである場合にのみ受け入れられますe。この違いは、式が多態であることを主張するために型注釈を使用することが不可能であるため、Camlでの注釈の実用性を大幅に低下させます。

  • Camlは、インターフェイス(モジュールタイプまたはシグネチャと呼ばれる)と(具体的な)実装(モジュールまたは構造と呼ばれる)の間にSMLよりもはるかに健全で賢明な関係を持っています。SMLではほとんどすべてのことがうまくいきますし、良い規則を確立するにはプログラマーに頼らなければなりません。Camlでは、コンパイラーによって適切な規則が確立され、適用されます。

  • SMLでは、算術演算子はオーバーロードされ、浮動小数点データと整数データの両方に適用されます。Camlでは、オペレーターは過負荷になりません。浮動小数点演算子は余分なドットで表記されます。

  • SMLでは、プログラマーは中置演算子の優先順位と結合性を制御できます。Camlでは、これらはオペレーターの名前の最初の文字によって決定されます。この制限により、独自の中置記法を定義できる利点が制限されます。

編集コメント付きの詳細な分析については、Adam Chlipalaの比較ページもご覧ください


4
等価性(OCamlでは無制限で安全ではないvs SMLでは安全だが制限された等価型)、一般化されていない型変数(OCamlでは '_a)、printf、OCamlでのモジュール名としてのファイル名の解釈、OCamlのstdlibでははるかにカリー化を忘れていました。2回目に何か他のもの(実装?)を意味するときに、インターフェイスを2回作成しました。
JD、

1
OCamlのor-patternsとパターンマッチングのガード。
JD

1
型注釈の有用性に関する制限は、注釈e : 'a . ty(a)が可能で意味のある3.12で多少緩和されていることに注意してください。

4
あなたは重要な観察をします:「Camlライブラリは非常に必須です」。これは哲学全体に浸透しているようで、マルチコアハードウェアでの並列実装は非常に困難または不可能であるように見えます。対照的に、少なくとも2つの並列SML(MltonとPoly / ML)があります。
Makarius 2013年

2
3番目のポイントについては、OCamlではレコード名に一意性は必要なくなりました。
PatJ 2015


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.