任何人都可以解释原因,
Prelude> let a = 1
Prelude> :type a
a :: Integer
Prelude> :type 1
1 :: Num a => a
为什么a是Integer
而1
是Num
?
我理解为什么1+2
会Num
。但为什么1
?
提前致谢。
答案 0 :(得分:13)
这只是类型推断在交互式提示中如何工作的工件。对于作为a
类型类的实例的任何Num
,所有数字文字都是多态的,但在GHCi提示符中,任何没有显式签名的let
绑定都是用单态类型推断的(更多细节) here)。
您可以通过设置
使GHCi推断出更一般的类型Prelude> :set -XNoMonomorphismRestriction
Prelude> let a = 1
Prelude> :type a
a :: Num a => a
答案 1 :(得分:5)
1
只是一个普通的Num
实例,而不是任何特定实例,是完全合理的,也是Haskell类型类的优点之一。这允许你在任何上下文中使用积分文字,从实际整数到复数到无限维希尔伯特空间算子,从不必担心转换或你发现如此丑陋的“7.0
”(或更糟)文字通常用其他语言。
更好的问题是:为什么a
不是这样的一般情况,而是具体的Integer
类型?这与dreaded monomorphism restriction有关。如shang所示,你可以关闭它;但是在GHCi中,让编译器为你做出固定的选择实际上很方便,因为你通常不想在那里写出类型签名。
在Haskell源文件中,单态限制基本上只是一个工件,因为Wiki文章说没有人真正满足它。