gdc 7.8.2上的GADT和明确的forall

时间:2014-05-24 20:44:42

标签: haskell ghc existential-type gadt

我在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时,类型检查成功。 但T1T2似乎相当。这是ghc中的错误还是GADT的一些限制?如果后者那么两者有什么区别?

2 个答案:

答案 0 :(得分:4)

我原先假设a构造函数中的T1data 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

我宁愿首选ba相比更突出,但我认为对于那些更喜欢它的人来说,这仍然优于隐式forall,包括我自己。