约束中的模糊类型变量`p0'

时间:2011-12-30 17:53:49

标签: haskell

我收到错误

Ambiguous type variable `p0' in the constraints:
      (Show p0) arising from a use of `print' at cwqr_0003.hs:31:6-10
      (Ord p0) arising from a use of `PSQ.lookup'

来自下面的代码。

我不知道如何分析这个。这可能是GHC或其中一个模块中的问题吗? 如果我尝试使用putStr代替print,那么我会得到与预期类型相关的错误,而不是字符串,而不是p0。当我尝试fromMaybe时,它会给我一个与我发送给Mayay的默认值literal zero相关的错误

import qualified Data.PSQueue as PSQ
import Data.Maybe
import Data.Label
import Control.Category
import Prelude hiding ((.))

--some tested code omitted here 

let r = PSQ.lookup test' q
--putStr (show (r :: String)) 
print (r) 

1 个答案:

答案 0 :(得分:4)

错误消息实际上意味着它所说的内容:您有一个模糊的类型。这是怎么发生的?通常,因为你有一些产生多态结果的东西,然后应用一个函数,该函数对该结果采用多态参数,这样中间值的类型是未知的。

在简单的多态类型中,歧义并不重要:如果生成某个列表,然后取长度,我们不需要知道列表元素的类型是什么。

如果歧义涉及使用类型类,例如Show,那么print会这样做 - GHC卡住了,因为它无法知道应该选择哪个实例。

有时也会出现这种情况,因为特定的定义被强制为单态(除非您另有说明),这会强制选择单一类型而不是保留多态性。我怀疑这可能是你的问题,但如果没有你删除的上下文,我无法分辨。

为了说明后者,定义如下:

foo = print

...没有类型签名,会导致如下错误:

Test.hs:12:7:
    Ambiguous type variable `a0' in the constraint:
      (Show a0) arising from a use of `print'
    Possible cause: the monomorphism restriction applied to the following:
      foo :: a0 -> IO () (bound at Test.hs:12:1)
    Probable fix: give these definition(s) an explicit type signature
                  or use -XNoMonomorphismRestriction
    In the expression: print
    In an equation for `foo': foo = print