Haskell GHC不接受GADT类型签名
此声明不起作用:Haskell GHC不接受GADT类型签名,haskell,Haskell,此声明不起作用: data Identity a where {Identity :: (->) a (Identity a)} 如何解决此问题?至少从GHC 7.8开始,如果您启用GADT支持,那么您的代码类型将检查并执行您期望的操作: {-# LANGUAGE GADTs #-} data Identity a where {Identity :: (->) a (Identity a)} 导致: GHCi, version 7.8.3: http://www.haskell
data Identity a where {Identity :: (->) a (Identity a)}
如何解决此问题?至少从GHC 7.8开始,如果您启用GADT支持,那么您的代码类型将检查并执行您期望的操作:
{-# LANGUAGE GADTs #-}
data Identity a where {Identity :: (->) a (Identity a)}
导致:
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( foo.hs, interpreted )
Ok, modules loaded: Main.
λ» :i Identity
data Identity a = Identity a -- Defined at foo.hs:2:1
使用中缀形式的
->
。我不知道为什么会有不同,但确实如此。(即数据…其中{Identity::a->Identity a}
)如果尚未报告,则可能会将其报告为错误。@q4ntumcpa:区别在于GADT构造函数声明中的签名可能涉及严格性注释(!
),这在任何其他地方都是不允许的。我怀疑GHC对于GADT类型签名和其他类型签名有两个单独的语法。另外,我可以想象一些(弱!)参数,构造器不是真正的函数,前缀语法(>)
有点建议您可以自由地对其进行泛化(这不是真的,同样是因为!
)。