4

如果我们输入show 2,那么我们将得到“2”。但问题是显示满足show :: Show a => a -> String,并且2是多态的,如果不幸show 2::Int与我们不同,show 2::Integer我们将不得不写show 2::Intshow 2::Integer不是简单地写show 2

我拒绝假设编译器足够聪明,可以知道(A a)=>show aA 的所有当前实例何时都属于 Show,给出相同的结果,我们不需要指定show a::X,以及 A 的所有当前实例何时(A a)=>show a属于 Show,给出不同的结果,我们必须指定show a::X.

4

1 回答 1

14

这是由于默认规则。show 2实际上也是如此show (2::Integer)您可以在第 4.3.4 节的 haskell 2010 报告中阅读此内容。

要回答您的第二个问题,编译器不够智能。它是由于类型默认而发生的。

你可以检查

 number = 2

在 ghci

*Main> :t number 
 number :: Integer

现在您的自定义默认签名

 default (Int)
 number = 2

在 ghci

*Main> :t number
number :: Int

您可以在我引用的文档中了解何时可以默认类型。

于 2012-12-28T03:52:24.373 回答