如果Haskell的编译器总是需要用"::Int"指定多态函数的多态参数,为什么"show 2"是合法的



如果我们输入show 2,那么我们将得到"2"。但问题是show满足show :: Show a => a -> String, 2是多态的,如果不幸的是show 2::Intshow 2::Integer不同,我们必须写show 2::Intshow 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

你可以在我引用的文档中读到什么时候类型是默认的

最新更新