4
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

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

4

1 回答 1

4

来自Haskell 报告

在发现不明确类型的情况下,不明确类型变量v在以下情况下是可默认的:

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

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

于 2012-08-25T09:30:02.150 回答