Haskell 多态性;“翻转”;在7.10中失败
该库包含以下代码段(有望在7.8中编译): 然而,在7.10中,GHC抱怨:Haskell 多态性;“翻转”;在7.10中失败,haskell,ghc,Haskell,Ghc,该库包含以下代码段(有望在7.8中编译): 然而,在7.10中,GHC抱怨: Couldn't match type ‘k2 a0 -> b’ with ‘forall (a :: k0). k1 a -> b’ Expected type: MonomorphicRep k2 -> (k2 a0 -> b) -> b Actual type: MonomorphicRep k1 -> (forall
Couldn't match type ‘k2 a0 -> b’ with ‘forall (a :: k0). k1 a -> b’
Expected type: MonomorphicRep k2 -> (k2 a0 -> b) -> b
Actual type: MonomorphicRep k1
-> (forall (a :: k0). k1 a -> b) -> b
Relevant bindings include
liftPoly :: (forall (a :: k). k2 a -> b) -> MonomorphicRep k2 -> b
(bound at Data/Type/Monomorphic.hs:45:1)
In the first argument of ‘flip’, namely ‘withPolymorphic’
In the expression: flip withPolymorphic
当然,如果我将liftPoly
的定义更改为
liftPoly a b = withPolymorphic b a
那么7.10是快乐的。这是怎么回事?在处理多态函数时,7.10应该更严格吗?它似乎不是单态限制,因为每样东西都有一个签名。翻转的类型是
flip :: (x -> y -> z) -> (y -> x -> z)
要进行类型检查liftPoly
,我们必须在所有a的多态类型中实例化变量y
。k a->b
。这是非指示多态性的一个实例
正如页面上所说
我们已经做了各种尝试来支持非指示性,因此有一个标志-ximpeditivetypes
。但它不起作用,而且绝对不受支持。如果你使用它,你就只能靠自己了;我不保证会发生什么事
因此,当GHC版本之间
impendectivetypes
的行为发生变化时,不要太惊讶。我认为,impendectivetypes实际上不受支持。因此,与他们相关的事情发生了变化也就不足为奇了。但是:尝试注释翻转的类型,我敢打赌它会起作用。
flip :: (x -> y -> z) -> (y -> x -> z)