回答:
技術的にも社会政治的にも、多くの違いがあります。私はもっと重要な違いを最初にしようとしました。
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の比較ページもご覧ください。
Norman Ramseyが述べた構文の違いに関する詳細については、ここにいくつかのWebページがあります。
OCamlはオブジェクト指向機能を追加し、いくつかの小さな構文の違いがあります。