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

zaa*_*son 4 haskell typeclass

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

例如在 ghci 中

> :t 1
1 :: Num p => p
> print 1
1
Run Code Online (Sandbox Code Playgroud)

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

类似的例子:

> 7*15+2
107
Run Code Online (Sandbox Code Playgroud)

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

键入 eg print $ 5 ^ 5 ^ 5(在 Int 范围之外)会打印正确的数字,因此我猜测它是Integer而不是Int

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

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

Vik*_*lis 5

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