[英]GADT and explicit forall on ghc 7.8.2
我在gdc 7.8.2上玩GADTs和明确的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的一些限制? 如果后者那么两者有什么区别?
我最初假设a
T1
构造函数在data T1 a
处绑定了data T1 a
声明。 但它实际上是在构造函数本身中隐式量化的。 因此T2
构造函数是错误的,因为它明确地量化了b
并且没有量化a
。
我正在努力解决类似的问题。 根据chi的评论,我提出了这个解决方案:
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GADTs #-}
data T2 :: * -> * where
T2 :: forall a b. (b -> a) -> b -> T2 a
我宁愿首选b
相比,脱颖而出a
,但我想这仍然比隐式更好forall
为那些喜欢谁是明确的,包括我自己。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.