Class 如果Haskell的编译器始终需要使用";::,指定多态函数的多态参数:Int";,为什么;显示2“;合法
如果我们键入Class 如果Haskell的编译器始终需要使用";::,指定多态函数的多态参数:Int";,为什么;显示2“;合法,class,function,haskell,show,polymorphism,Class,Function,Haskell,Show,Polymorphism,如果我们键入show2,那么我们将得到“2”。但问题是show满足show::show a=>a->String,并且2是多态的,如果不幸的是show2::Int与show2::Integer不同,我们必须编写show2::Int和show2::Integer而不是简单地show2 我拒绝假设编译器足够聪明,可以知道当(A)=>显示A时,A的所有当前实例都是show,给出相同的结果,我们不需要指定显示A::X,当(A)=>显示A时,A的所有当前实例都是show,给出不同的结果,我们必须指定sho
show2
,那么我们将得到“2”。但问题是show满足show::show a=>a->String
,并且2
是多态的,如果不幸的是show2::Int
与show2::Integer
不同,我们必须编写show2::Int
和show2::Integer
而不是简单地show2
我拒绝假设编译器足够聪明,可以知道当
(A)=>显示A
时,A的所有当前实例都是show,给出相同的结果,我们不需要指定显示A::X
,当(A)=>显示A
时,A的所有当前实例都是show,给出不同的结果,我们必须指定show a::X
这是由于默认规则造成的。所以show2
实际上是show(2::Integer)
。你可以在哈斯克尔2010年的报告中看到这一点
要回答第二个问题,编译器不够智能。这是由于类型默认而发生的
你可以查一下
number = 2
在ghci中
*Main> :t number
number :: Integer
*Main> :t number
number :: Int
现在,您可以自定义默认签名
default (Int)
number = 2
在ghci中
*Main> :t number
number :: Integer
*Main> :t number
number :: Int
您可以在我引用的文档中了解类型何时为默认值。谢谢,您的答案也适用于为什么数据为默认值。TypeTable导入了“typeOf 2=Integer”。