我在gdc 7.8.2上玩GADT和明确表达。让我们看看以下简单示例:
{-# LANGUAGE GADTs, RankNTypes #-}
data T1 a where
T1 :: (b -> a) -> b -> T1 a
data T2 a where
T2 :: forall b. (b -> a) -> b -> T2 a
这里ghc失败了:
Test.hs:7:26: Not in scope: type variable ‘a’
Test.hs:7:35: Not in scope: type variable ‘a’
注释T2
时,类型检查成功。
但T1
和T2
似乎相当。这是ghc中的错误还是GADT的一些限制?如果后者那么两者有什么区别?
答案 0 :(得分:4)
我原先假设a
构造函数中的T1
在data T1 a
声明处被绑定。
但它实际上是在构造函数本身中隐式量化的。因此,T2
构造函数是错误的,因为它明确量化了b
并且没有量化a
。
答案 1 :(得分:0)
我正在努力解决类似的问题。基于chi的评论,我提出了这个解决方案:
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GADTs #-}
data T2 :: * -> * where
T2 :: forall a b. (b -> a) -> b -> T2 a
我宁愿首选b
与a
相比更突出,但我认为对于那些更喜欢它的人来说,这仍然优于隐式forall
,包括我自己。