この件に関する多くの文献が非常に密集しているのは残念です。私もあなたの立場にありました。私はプログラミング言語:アプリケーションと解釈からこのテーマの最初の紹介を得ました
http://www.plai.org/
抽象的アイデアを要約し、その後すぐには明らかにならなかった詳細を説明します。まず、型推論は制約を生成して解決することと考えることができます。制約を生成するには、構文ツリーを再帰して、各ノードに1つ以上の制約を生成します。たとえば、ノードが+
演算子の場合、オペランドと結果はすべて数値でなければなりません。関数を適用するノードは、関数の結果と同じタイプになります。
のない言語のlet
場合、上記の制約を代入することで盲目的に解決できます。例えば:
(if (= 1 2)
1
2)
ここでは、ifステートメントの条件はブール値である必要があり、ifステートメントのタイプはthen
and else
句のタイプと同じであると言えます。私たちは数字であることがわかっ1
て2
いるので、代入によって、if
ステートメントは数字であることがわかります。
物事が厄介になり、しばらく理解できなかった場合、letを処理します。
(let ((id (lambda (x) x)))
(id id))
ここでは、id
渡されたものを返す関数にバインドしました。これは、識別関数とも呼ばれます。問題は、関数のパラメーターのタイプがのx
使用ごとに異なることですid
。2番目id
はタイプの関数ですa -> a
、a
何でもかまいません。最初のタイプ(a -> a) -> (a -> a)
です。これはlet-polymorphismとして知られています。重要なのは、特定の順序で制約を解決することです。最初にの定義の制約を解決しますid
。これはになりますa -> a
。タイプのその後新鮮な、別のコピーid
各場所の制約に置換することができるがid
、例えば、使用されるa2 -> a2
とa3 -> a3
。
これはオンラインリソースでは簡単に説明されていませんでした。彼らはアルゴリズムWまたはMについて言及しますが、制約の解決の観点からはどのように機能するのか、またはlet-polymorphismでそれができない理由については触れません。これらの各アルゴリズムは制約の解決に順序を強制します。
このリソースは、アルゴリズムW、M、および制約の生成とすべての解決の一般的な概念を結び付けるのに非常に役立つことがわかりました。それは少し密度が高いですが、多くのものより優れています:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
他にも多くの論文があります。
http://people.cs.uu.nl/bastiaan/papers.html
それがややあいまいな世界を明らかにするのに役立つことを願っています。