Haskell - ghci - 为什么1的类型是Num?

时间:2013-11-12 10:43:31

标签: haskell ghci

任何人都可以解释原因,

Prelude> let a = 1
Prelude> :type a
a :: Integer
Prelude> :type 1
1 :: Num a => a

为什么a是Integer1Num? 我理解为什么1+2Num。但为什么1

提前致谢。

2 个答案:

答案 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文章说没有人真正满足它。