Haskell 多态性;“翻转”;在7.10中失败

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

该库包含以下代码段(有望在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 (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)