haskell - 奇怪的模糊类型变量错误消息,用于具有TypeFamilies扩展名的“where”语句中的代码

时间:2011-10-28 01:30:26

标签: haskell types ghc ambiguity

有谁知道为什么这段代码会失败?

{-# LANGUAGE NoMonomorphismRestriction,
             TypeFamilies #-}

module Test where

asExprTyp :: Expr γ =>
    γ α
    -> α
    -> γ α
asExprTyp x _ = x

int = undefined :: Integer

class Expr γ where
    a :: γ α

-- this works fine
b = a `asExprTyp` int

-- this fails
mcode = do
    return ()
    where b = a `asExprTyp` int

错误如下,

Test.hs:23:15:
    Ambiguous type variable `γ0' in the constraint:
    (Expr γ0) arising from a use of `a'
    Probable fix: add a type signature that fixes these type variable(s)
    In the first argument of `asExprTyp', namely `a'
    In the expression: a `asExprTyp` int
    In an equation for `b': b = a `asExprTyp` int
Failed, modules loaded: none.

2 个答案:

答案 0 :(得分:2)

我不知道ghc会抱怨什么。我认为这可能是因为它试图为本地绑定提供单态类型,但在语言编译指示中添加NoMonoLocalBinds并没有改变任何内容。

然而,代码与最近的HEAD(7.3.20111026)一样编译,以及它在没有启用TypeFamilies的情况下进行编译的事实,它支持错误假设。

如果这是一个真正的问题,你必须解决:添加类型签名让ghc高兴。

答案 1 :(得分:0)

好吧,由于我从未在Haskell中使用过类型系列,所以这有点过头了。但是,您的示例实际上并没有使用类型系列,所以我想我会看到当我从TypeFamilies pragma中删除LANGUAGE语言扩展时会发生什么。事实证明:它编译就好了! :)

所以它很可能是一个GHC错误。

话虽如此,我稍微捅了一下,注意到下面的内容在TypeFamilies启用时很愉快地编译:

mcode = do
            b
            return ()
        where b = a `asExprTyp` int

这可能是荒谬的,因为它的推断类型是mcode :: (Expr m, Monad m) => m (),而不仅仅是mcode :: Monad m => m (),但我的观点是GHC似乎只有当a的类型与某些类型绑定时才会感到高兴通往mcode类型的方式。

不确定这是否有用,但它肯定引起了我的好奇心!