そのため、小さな Haskell の演習を通じて Curry-Howard を半分理解しようとする継続的な試みの中で、私はこの時点で行き詰まってしまいました。
{-# LANGUAGE GADTs #-}
import Data.Void
type Not a = a -> Void
-- | The type of type equality proofs, which can only be instantiated if a = b.
data Equal a b where
Refl :: Equal a a
-- | Derive a contradiction from a putative proof of @Equal Int Char@.
intIsNotChar :: Not (Equal Int Char)
intIsNotChar intIsChar = ???
明らかに、型Equal Int Char
には (非底部の) 居住者がいないため、意味的には関数が存在するはずabsurdEquality :: Equal Int Char -> a
です...しかし、私の人生では、を使用する以外に書く方法がわかりませんundefined
。
したがって、次のいずれかです。
- 何かが足りない、または
- これを不可能な作業にする言語のいくつかの制限があり、それが何であるかを理解することができませんでした.
答えは次のようなものだと思います。コンパイラはEqual
、a = b を持たないコンストラクターがないという事実を利用できません。しかし、もしそうなら、何がそれを真実にするのでしょうか?