我收到错误
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)
答案 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