所以,在我不断尝试通过小哈斯克尔练习半懂咖喱霍华德,我已经得到停留在这一点上:GADT可以用来证明GHC中的类型不等式吗?
{-# 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 [email protected]
intIsNotChar :: Not (Equal Int Char)
intIsNotChar intIsChar = ???
显然类型Equal Int Char
无(无底)居民,因此在语义上应该有一个absurdEquality :: Equal Int Char -> a
函数......但在我的生活中,我找不到任何方法来编写除undefined
以外的其他方法。
因此,要么:
- 我失去了一些东西,或
- 没有使这个不可能完成的任务了语言的一些限制,我没有设法去了解它是什么。
我怀疑答案是这样的:编译器无法利用的事实,即没有a = b的构造函数Equal
。但是,如果是这样,是什么原因呢?
请参阅:http://typesandkinds.wordpress.com/2012/12/01/decidable-propositional-equality-in-haskell/ – glaebhoerl
@dbaupp:不是重复的 - 该问题不是试图做任何事情一个不平等的证明。 –
@ C.A.McCann,嗯,我想我应该仔细阅读,然后才开始肆意指责。 :) – huon