呼び出しサイトに基づく型推論に関する研究?


9

(関数本体を使用する標準的なアプローチに加えて)関数呼び出しサイトからの情報を使用して型情報を計算する、プログラム全体の型チェックと型推論システムについて詳しく学びたいと思っています。たとえば、このようなアルゴリズムでは、関数の呼び出しを使用しfoo(1)て、関数in fooが整数の引数をとることを推測する場合があります。明らかにこれは推論を非常に複雑にし、チェックを非モジュラーにします。

とにかく、私がこのアプローチに関する研究を見つけることができなかったのは、おそらく私が話していることを説明する正しい用語がわからないためです。ポインタはありますか?


あなたが説明しているものは、私が誤解しない限り、双方向型推論のヒントを持っています。ただし、何をしようとしているのかを説明することで明確になる場合があります。
ドミニクマリガン

ポリモーフィック関数を専門化する方法を模索しているので、質問がありますか?
nponeccop

私はたいてい、本当に型システムについてもっと学びたいと思っているだけです。そうです、私は主に多態性関数(およびOO言語でのメソッド呼び出し、同じこと)を処理する方法について考えていました。私はこれを読むことができるように、これに適切な用語を特定しようとしています。
Derek Thurn、2011年

回答:


11

型推論を持つほとんどすべてのシステムは、これを行うために呼び出しサイト情報を使用します。たとえば、標準ML、OCaml、F#、Haskellなどです。Java、C#、Scala、型付きラケットなど、他の多くの言語は、型パラメーターのインスタンス化を推測するために呼び出しサイト情報を使用します。これはしばしば「ローカル型推論」という名前で行きます。

あなたが探しているものを「型推論」として説明します。おそらく、「Hindley-Milner」システムとして一般的に知られているものを調べることから始めるべきでしょう。ウィキペディアのページは、合理的な紹介と、元の論文へのポインタを提供します。

Local Type Inferenceの開始点は、Pierce and Turnerのオリジナルペーパーです。TOPLAS2000バージョン(ACMPDF)で読むのが最適です。


ピアスとターナーのペーパーは非常に啓蒙的でした、ありがとう。彼らがコードで記述するアルゴリズムの最小限の実装を知っていますか?あるとすれば、それも見ていて面白いと思います。
Derek Thurn

最小限の実装については知りません。Typed RacketとScalaに1つずつありますが、どちらもかなり複雑なアルゴリズムを実装しています。
Sam Tobin-Hochstadt

0

あなたはあなたのような何かを与えることができ、交差点の種類のタイプのシステムを見てみることができますa :: Int -> Int | Bool -> Boolあなたはには2つの専門ことを知っているので、IntとはBool十分にある、または実際に収集するために、制御フロー解析に続いて最も一般的なタイプを推測するために通常の型推論を使用します型引数。実際には、ハイブリッドアプローチがあります(CFAは型システムとして表現され、その逆も同様です)。

最も一般的なタイプではなく、最も一般的でないタイプを推測する研究が存在する可能性がありますが、私はそれらを知りません。

ポリモーフィズムを実装する手法については、2つのソリューションが存在します。1)特殊化(C ++テンプレートを考える)2)均一な表現の仮定(void *を含むCスタイルのコレクションを考える)。

2の場合、型チェック中にcall-siteからの型を必要とせず、個別のコンパイルをより簡単にサポートできます。

ここではパラメトリックポリモーフィズムについて話していることに注意してください。OO仮想メソッド呼び出しは、サブタイプポリモーフィズムと呼ばれるものとはまったく異なります。C ++テンプレートは、パラメトリックポリモーフィズムとダックタイピングのようなものをサポートしています。これは、ポリモーフィズムのもう1つの形式です。


1
「OO仮想メソッド呼び出しは、アドホックポリモーフィズムと呼ばれるものとはまったく異なります」アドホックポリモーフィズムは、オーバーロードの別名です。あなたはそれをサブタイプ多型と混同しているようです。
Radu GRIGore、2011年

しかし、サブクラスは必ずしもサブタイプであるとは限りませんね。たとえば、サブタイプの場合、LSPが保持することになっています。
nponeccop

1
本当ですが、要点は別です。「サブタイプ多型」は標準的な用語です。詳細については、en.wikipedia.org / wiki / Subtype_polymorphismを参照してください。
Radu GRIGore 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.