ラムダ項の (最も一般的で単純な) 型の推論は、非常に単純で非常に有益な作業です。ラムダ項を解読しようとするとき、その型を推測することから始めることは非常に良いアプローチです。
型推論の背後にある一般的な考え方は、ジェネリック型 (型変数) を任意の識別子に関連付けることから始め、用語内の識別子の使用に従ってこの型を改良することです。これは、ラムダ計算では非常に簡単です。識別子は、関数の引数として、または関数としての 2 つの方法でしか使用できないためです。
たとえば、あなたの例では、x: α と y: β とします。しかし、x は y に適用されるため、関数型を持たなければならず、さらにその入力は引数 y の型と互換性がなければならないため、α を (β -> γ) に改良します。 ) アプリケーションの結果タイプ (xy)。
項 (xy) は y に適用されます。これは、γ も実際には関数型でなければならないことを意味します。つまり、γ = β -> δ です。
この場合、基本的にこれで分析は終了です。
わかりやすくするために、すべてのサブタームのタイプを以下に示します (すべてのアプリケーションが適切にタイプされていることを確認してください)。
x : β -> β -> γ
y : β
(x y) : β -> γ
((x y) y) : γ
\y.((x y) y) : β -> γ
\x.\y.((x y) y) : (β -> β -> γ) -> β -> γ
さらに、g:β -> β -> γ、および h:β と結論付けます。式全体は型 γ を持ちます。
もう少し興味深い例として、\y.\x.(y (yx)) という用語があります。x:αとする。その場合、y の型は α -> β である必要があります。ここで、β は結果の型 (yx) です。この項は y への入力として再び渡されます。つまり、α=β です。\y.\x.(y (yx)) : (α -> α) -> α -> α
一般に、場合によっては、同じ識別子を複数回使用する場合、それらの間で最も一般的なインスタンスを推測して、それらの型を統一する必要があります。
Damas-Milner 型推論アルゴリズムに関するウィキページはかなり適切ですが、私の意見では、このような単純で直感的なトピックについては非常に技術的です。