Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell GHC不接受GADT类型签名_Haskell - Fatal编程技术网

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类型签名和其他类型签名有两个单独的语法。另外,我可以想象一些(弱!)参数,构造器不是真正的函数,前缀语法
(>)
有点建议您可以自由地对其进行泛化(这不是真的,同样是因为
)。