繁体   English   中英

gdc 7.8.2上的GADT和明确的forall

[英]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被注释掉时,类型检查成功。 但是T1T2似乎是等价的。 这是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM