1

谁能解释一下为什么,

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

为什么 a 是 anInteger并且1是 a Num?我能理解为什么1+2会这样Num。但是为什么1

提前致谢。

4

2 回答 2

13

这只是类型推断在交互式提示中如何工作的工件。a对于任何类型类的实例,所有数字文字都是多态的Num,但在 GHCi 提示中,任何let没有显式签名的绑定都将被推断为单态类型(更多详细信息,请参见此处)。

您可以通过设置让 GHCi 推断出更通用的类型

Prelude> :set -XNoMonomorphismRestriction 
Prelude> let a = 1
Prelude> :type a
a :: Num a => a
于 2013-11-12T10:53:45.557 回答
5

1只是一个普遍的Num例子,而不是任何特定的例子,是完全合理的,也是 Haskell 类型类的一大优点。这允许您在从实际整数到复数再到无限维希尔伯特空间运算符的任何上下文中使用整数文字,而不必担心7.0您在其他语言中经常发现的转换或丑陋的“”(或更糟)文字。

一个更好的问题是:为什么a不是这样的一般实例,而是具体Integer类型?这与可怕的单态限制有关。如shang所示,可以将其关闭;但在 GHCi 中,有时让编译器为您做出固定选择实际上很方便,因为您通常不想在那里编写类型签名。

在 Haskell 源文件中,单态限制基本上只是一个人工制品,因为 Wiki 文章说没有人真正满足于它。

于 2013-11-12T10:57:08.353 回答