因此,在我不断尝试通过小型 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 的构造函数这一事实。但如果是这样,那它是真的吗?