8

F# と OCaml の型推論の違いを調査したところ、主格型と構造 型システムに注目する傾向があることがわかりました。次に、型付けと型推論を異なる特性としてリストする関数型プログラミング言語の特徴的な特性を見つけました。

トレイトの記事では、OCaml と F# はどちらもDamas-Milner型推論を使用すると述べていますが、これは標準アルゴリズム、つまりバリエーションを許可しないアルゴリズムであると私は考えていましたが、2 つのトレイトはどのように関連しているのでしょうか? Damas-Milner は両方の型推論システムが構築される基礎であるということですが、それらはそれぞれ型付けに基づいて Damas-Milner を変更しますか?

また、Damas、Milner、および Hindley という単語の F# ソース コードを確認しましたが、何も見つかりませんでした。単語推論を検索すると、型推論のコードが見つかりました。

もしそうなら、特定の言語の各型推論アルゴリズムの詳細を議論する論文はありますか、それともOCamlF#のソースコードを見る必要がありますか?

編集

これは、OCaml と F# の間の型推論に関連するいくつかの違いを強調するページです。

4

3 に答える 3

6

DMの質問に関しては、あなたは正しいです。F# と OCaml の両方にとって、DM アルゴリズムは単なるパターンです。型チェッカーは、カスタム機能をサポートするために拡張されています。OCaml では、これらの機能には、行型、ポリゴン バリアント、ファーストクラス モジュールを持つオブジェクトが含まれます。F# - .NET 型システムの相互運用 (クラス、インターフェイス、構造体、サブタイピング、メソッドのオーバーロード)、測定単位。F# の型推論も、より効率的な対話型チェックを可能にするために左から右に偏っていると思います。そのため、一部のコードには驚くほど注釈が必要です。

型チェックと推論に関する限り、OCaml は F# よりも表現力と直感性に優れています。SML はどちらよりも標準的な HM に近いですが、SML にはいくつかの演算子のポリモーフィズムとレコードのサポートのための拡張機能もあります。

于 2012-09-11T12:04:27.460 に答える
4

彼らが OCaml の構造型付けについて話すとき、おそらくオブジェクト システム ("OCaml" の "O" の部分) について言及していると思います。OCaml の非オブジェクト部分はかなり標準的な ML 型システムです。珍しいのはオブジェクトシステムです。

OCaml のオブジェクト システムは、F# の .NET クラス ベースのオブジェクト システムとは大きく異なります。OCaml では、クラスを使用せずにオブジェクトを直接作成できます。クラスは基本的に、オブジェクトを作成するための便利な機能です。作成後のオブジェクト (リテラルを使用して直接作成するか、クラスを使用して作成する) には、そのクラスの概念がありません。

オブジェクトを受け取り、特定のメソッドを呼び出す関数を作成するとどうなるかを見てください。

# let foo x = x#bar;;
val foo : < bar : 'a; .. > -> 'a = <fun>

引数の型は、 という名前のメソッドを含む抽象型であると推測されますbar。したがって、そのようなメソッドと型を持つ任意のオブジェクトを取ることができます。

それが、オブジェクト システムが構造的に型付けされていると彼らが言うときの意味です。オブジェクトに関して重要なのは、オブジェクトをどこで使用できるかを決定する一連のメソッドだけです。したがって、互換性はメソッドの「構造」に基づいています。そして、「クラス」の考えではありません。

于 2012-09-10T22:41:27.603 に答える
2

トレイトの記事では、OCaml と F# の両方が Damas-Milner 型推論を使用していると述べていますが、これは標準的なアルゴリズム、つまりバリエーションを許可しないアルゴリズムであると私は考えていましたが、2 つのトレイトはどのように関係しているのでしょうか?

Damas-Milner アルゴリズム (Algorithm W としても知られる) は拡張可能であり、実際に、実際に関連するすべての実装には、OCaml と F# の両方を含む多くの拡張機能が追加されています。

Damas-Milner は両方の型推論システムが構築される基礎であるということですが、それらはそれぞれ型付けに基づいて Damas-Milner を変更しますか?

そうです。特に、OCaml には、ポリモーフィック バリアント、オブジェクト、ファーストクラス モジュールを含む、Damas-Milner コアへの非常に多くの異なる実験的拡張機能があります。F# はより単純ですが、OCaml にないいくつかの拡張機能も備えています。最も顕著なのはオーバーロード (主に演算子) です。

OCaml や F# の型システム全体を記述した要約論文があるとは思えません。実際、今日の F# 型システムについて説明している論文を私は知りません。OCaml については、それぞれが異なる側面をカバーする多くの異なる論文があります。Jacques Garrigue 自身の出版物から始めて、そこにある参考文献をたどります。

于 2012-09-14T22:05:35.670 に答える