AndrejまたはNeelの説明に何かを追加するのは難しいですが、試してみましょう。説明がより基本的であり、あなたの質問に対してより簡単な答えを与えるので、私は基礎的なセマンティクスを明らかにしようとするのではなく、構文の観点に対処しようとします。
λ
重要なリファレンスは次のとおりです。
メンドラー、N。(1991)。2次ラムダ計算における帰納的な型と型の制約。私は恐れているオンライン参照を見つけていません。ただし、ステートメントと証明は、Naxの博士論文(強くお勧めします!)にあります。
Bad
Bad=Bad→A
A
λx:Bad.x x:Bad→A
など
(λx:Bad.x x) (λx:Bad.x x):A
Bad=F(Bad)
F(X)XF(X)
もちろん、等式で定義された型ではなく、コンストラクタで作業しています。つまり、
data Bad = Pack (Bad -> A)
厳密な平等というよりは。ただし、定義できます
unpack :: Bad -> (Bad -> A)
unpack (Pack f) = f
この結果が保持され続けるには十分です:
(\x:Bad -> unpack x x) (Pack (\x:Bad -> unpack x x))
A
2番目の例では、物事はもう少し複雑です。
Bad=Bad′→A
Bad′BadBad aBad (Not a)
type Not a = a -> False
と
data Not a = Not a
Haskellがそのような型定義を許可していれば、簡単に解決できます。
type Acc = Not Acc
この場合、以前とまったく同じ方法でループコンビネーターを構築できます。を使用して同様の(ただし、より複雑な)構造を実行できると思います
data Acc = D (Not Acc)
ここでの問題は、同型を構築することです
Bad Acc <-> Bad (Not Acc)
混合分散に対処する必要があります。