我在 ghc 7.8.2 上玩 GADT 和明确的 forall。让我们看下面这个简单的例子:
{-# 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 的某些限制?如果是后者,那么两者有什么区别?