質問
2 つの ML 方言の違いは何ですか?
解決
技術的な点や社会政治的な点など、多くの違いがあります。より重要な違いを最初に置くようにしました。
SML は定義と標準を持つ言語です。これは安定しています (実際には凍結されているため、進化することはできません)。Objective Caml は、INRIA の小グループによって管理される実装です。進化し続けています。(IMO では進化は適切に管理されています。)
SML には多くの実装があります。Camlには1つだけあります。
Objective Caml には多数の追加機能がありますが、その中で最も顕著なものはおそらくオブジェクトと多態性バリアントです。
2 つの言語のレコード タイプのモデルは大きく異なります。簡単に言うと、Caml では、レコード フィールドの名前は一意である必要がありますが、SML では、同じスコープ内の 2 つの異なるレコード タイプが共通のフィールド名を持つことができます。この癖により、SML から Caml への移植が少し難しくなる可能性があります。
構文上の違いがかなり多くあります。
ライブラリと標準関数は大きく異なります。Caml ライブラリは非常に命令的であるのに対し、SML Standard Basis Library はより機能的です。たとえば、関数合成は 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 では、これらは演算子の名前の最初の文字によって決まります。この制限により、独自の中置表記を定義できる利点が制限されます。
編集者のコメントを含むより詳細な分析については、以下も参照してください。 アダム・クリパラの比較ページ.
他のヒント
Norman Ramsey が言及した構文の違いの詳細については、次の Web ページを参照してください。
- Objective Caml と標準 ML の比較:違いと「実用的な」ものと「「純粋」なアイコンも面白い
- 標準 ML と対物レンズ Caml を並べて表示
OCamlはオブジェクト指向の機能を追加し、いくつかのマイナーな構文の違いがあります。