一言で言えば、一般再帰です。
Haskell では任意の再帰が可能ですが、System F には再帰の形式がありません。無限の型がないということfix
は、閉じた用語として表現できないことを意味します。
名前と再帰の原始的な概念はありません。実際、純粋な System F には、定義などの概念はありません。
したがって、Haskell では、この単一の定義がチューリングの完全性を追加します。
fix :: (a -> a) -> a
fix f = let x = f x in x
実際、この関数はより一般的なアイデアを示しています。完全に再帰的なバインディングを持つことで、チューリングの完全性が得られます。これは、値だけでなく、型にも適用されることに注意してください。
data Rec a = Rec {unrec :: Rec a -> a}
y :: (a -> a) -> a
y f = u (Rec u)
where u x = f $ unrec x x
無限型を使用すると、Y コンビネータ (いくつかの展開を法とする) を記述し、それを使用して一般的な再帰を行うことができます!
純粋な System F では、定義の非公式な概念がよくありますが、これらは精神的に完全にインライン化される単純な略記です。Haskell では無限項が作成されるため、これは不可能です。
の概念のないHaskell 用語のカーネルはlet
、where
または=
強く正規化されています。これは、無限の型がないためです。この中心的な用語である微積分でさえ、実際にはシステム F ではありません。システム F には「大きなラムダ」または型の抽象化があります。id
System F におけるの完全な用語は
id := /\ A -> \(x : A) -> x
これは、System F の型推論が決定できないためです。ポリモーフィズムが予想される場合はいつでもどこでも明示的に記します。Haskell では、このようなプロパティは煩わしいので、Haskell の機能を制限します。特に、注釈なしで Haskell ラムダ引数のポリモーフィック型を推論することはありません(条件が適用される場合があります)。これがMLとHaskellの理由です
let x = exp in foo
と同じではありません
(\x -> foo) exp
exp
再帰的でない場合でも!これは、「let generalization」と呼ばれる HM 型推論とアルゴリズム W の核心です。