import Data.Dynamic
default(Integer,Double)
a :: Num a => a
a = 5
-- show :: Show a => a -> String
-- toDyn :: Typeable a => a -> Dynamic
main :: IO ()
-- main = print $ show a -- *** THIS LINE WORKS WELL
main = print $ toDyn a -- *** THIS LINE LEADS TO AN AMBIGUOUS TYPE ERROR
我不明白为什么第一个“主要”版本有效,而不是第二个版本。 有人可以帮助我吗? 在此先感谢您的回复。
答案 0 :(得分:4)
在发现模糊类型的情况下,如果出现以下情况,则模糊类型变量 v 将是默认的:
- v 仅出现在 C v 形式的约束中,其中 C 是一个类,
- 这些类中至少有一个是数字类(即
Num
或Num)
的子类,- 所有这些类都在Prelude或标准库中定义
您的示例失败,因为与Show
不同,Typeable
不是第三点中指定的类之一,因此不会执行默认操作。