如果我们输入show 2
,那么我们将得到"2"。但问题是show满足show :: Show a => a -> String
, 2
是多态的,如果不幸的是show 2::Int
与show 2::Integer
不同,我们必须写show 2::Int
和show 2::Integer
,而不是简单地写show 2
。
我拒绝假设编译器足够聪明,知道(A a)=>show a
, A的所有当前实例都是Show,给出相同的结果,我们不需要指定show a::X
,当(A a)=>show a
, A的所有当前实例都是Show,给出不同的结果,我们必须指定show a::X
。
这是由于默认规则。所以show 2
实际上是show (2::Integer)
。你可以在4.3.4节的haskell 2010报告中读到这些。
回答你的第二个问题,编译器不够智能。这是由于默认类型导致的。
你可以检查
number = 2
*Main> :t number
number :: Integer
现在您的自定义默认签名
default (Int)
number = 2
*Main> :t number
number :: Int
你可以在我引用的文档中读到什么时候类型是默认的