`Num` 的哪个实例与文字一起使用,例如在 `print 1` 中?

What instance of `Num` is used with literals e.g. in `print 1`?

我刚刚使用 haskell 作为计算器,希望得到一些关于数字文字类型实例歧义的神秘错误消息。但是得到了none.

例如在 ghci

> :t 1
1 :: Num p => p
> print 1
1

我期望像 print 1 这样的代码能够打破 xD,这似乎很疯狂。但是这里ghci需要用到Showclass的一些实现。 1 在运行时也以某种方式表示。使用什么表示,为什么不要求我指定类型?

类似例子:

> 7*15+2
107

表达式具有一般 Num a => a 类型,但经过计算,因此需要选择某种类型。是整数吗?这种行为当然是有道理的,但它是如何工作的?

输入例如print $ 5 ^ 5 ^ 5(超出 Int 范围)打印出正确的数字,所以我猜它是 Integer 而不是 Int.

我还没有找到任何通用的 Num a => Show a 实例,而是像 Int 这样的类型的实现是特定于它们的。

我已经在 8.8.47.10.39.0.2[ 版本中使用 ghc 进行了测试=40=]。提前致谢!

Haskell 有一个类型默认机制,以避免必须指定您键入的每个数字文字的类型。 Num 的默认类型是 Integer,而 Fractional(带小数点的文字)是 Double。您可以使用顶级默认声明更改这些默认值。 This 文章解释了默认规则

The expression has general Num a => a type but is calculated and for that some type needs to be chosen. Is it Integer? This behaviour of course makes sense but how does it work?

Haskell 与 type defaulting 一起使用,Num a => a 类型的默认值确实是 Integer。由于 Integer 也是 Show 类型类的成员,因此它仍将使用 Integer 并且 print $ 5 ^ 5 ^ 5 因此确实会使用 ShowInteger 实例=] 打印值。

默认默认为(Integer, Double)。更多信息 in the Report. You may also want to read about ExtendedDefaultRules;值得注意的是,这在 ghci 中是默认打开的。