模糊类型和重载数值运算的默认值

时间:2012-08-25 08:41:45

标签: haskell

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

我不明白为什么第一个“主要”版本有效,而不是第二个版本。 有人可以帮助我吗? 在此先感谢您的回复。

1 个答案:

答案 0 :(得分:4)

来自Haskell report

  

在发现模糊类型的情况下,如果出现以下情况,则模糊类型变量 v 将是默认的:

     
      
  • v 仅出现在 C v 形式的约束中,其中 C 是一个类,
  •   
  • 这些类中至少有一个是数字类(即NumNum)的子类,
  •   
  • 所有这些类都在Prelude或标准库中定义
  •   

您的示例失败,因为与Show不同,Typeable不是第三点中指定的类之一,因此不会执行默认操作。