【发布时间】:2012-12-25 17:51:46
【问题描述】:
所以,在我不断尝试通过小型 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。
所以要么:
- 我错过了什么,或者
- 语言的某些限制使这项任务成为一项不可能完成的任务,我还没有设法理解它是什么。
我怀疑答案是这样的:编译器无法利用没有没有 a = b 的 Equal 构造函数这一事实。但如果是这样,那它是真的吗?
【问题讨论】:
-
@dbaupp:不是重复的——这个问题并没有试图用不等式证明做任何事情。
-
@C.A.McCann,啊,是的,我想我应该更仔细地阅读,然后再开始胡乱指责。 :)
标签: haskell curry-howard