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

Tor*_*nny 4 polymorphism haskell class function show

如果我们输入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 a,A的所有当前实例都是Show,给出相同的结果,我们不需要指定show a::X,何时(A a)=>show a,A的所有当前实例都是Show,给出不同的结果,我们必须指明show a::X.

Sat*_*vik 14

这是由于违约规则造成的.所以show 2实际上是show (2::Integer).您可以在4.3.4节中的haskell 2010报告中阅读此内容.

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

你可以检查一下

 number = 2
Run Code Online (Sandbox Code Playgroud)

在ghci

*Main> :t number 
 number :: Integer
Run Code Online (Sandbox Code Playgroud)

现在您的自定义默认签名

 default (Int)
 number = 2
Run Code Online (Sandbox Code Playgroud)

在ghci

*Main> :t number
number :: Int
Run Code Online (Sandbox Code Playgroud)

您可以在我引用的文档中了解何时类型可以违约.