奇怪的Haskell/GHC输出

3

有人能给我解释一下这个输出吗?我完全是 Haskell 的新手,不知道为什么会出现这种情况。

import Data.Char

o=ord 'f'

main=do print (o==102)
    print (mod (102^2087) 9797)
    print (mod (o^2087) 9797)

输出:

xxx:~/Arbeitsfläche$ runhaskell st.hs
True
5253
0

使用Ubuntu操作系统,GHC版本为7.4.1。


3
ord 的类型是 Char -> Int,因此 o 是一个 Int。在 Haskell 中,Int 有一个上限,但 Integer 没有。 - Snowball
2个回答

7
这是因为o的类型为Int,其范围有限,因此(mod (o^2087) 9797)也是一个Int。然而,常量102属于通用数值类型(Num a => a),(mod (102^2087) 9797)属于通用整数类型(Integral a => a)。当必须将这个通用整数类型解析为具体类型时,即应用print时,缺省解析为选择Integer,即无界整数类型。这种解析的细节在Haskell 2010 Report4.3.4 Ambiguous Types, and Defaults for Overloaded Numeric Operations一章中进行了描述。

那似乎解决了问题。非常感谢你。 - Nymer

0
首先,ord 是一个函数,它返回一个字符的数字表示,在这种情况下是102。
  1. 你的第一行代码 (print (o==102)) 是在检查 o 是否等于 102,因为它确实相等,所以输出结果是 True

  2. 第二行代码 (print (mod (102^2087) 9797)) 对 mod 函数应用了两个参数。 mod 函数返回第一个参数除以第二个参数的余数。这是整数除法,因此不允许有小数部分。符号(^)表示取指数,即“102的2087次方”。

  3. 最后一行代码 (print (mod (o^2087) 9797)) 和第二行代码执行的操作相同,只是使用了不同的参数。

希望这样清楚明了!


1
我认为Nymer感到困惑,因为最后一行输出的是0而不是5253,尽管o == 102 - Snowball
不是真的,但那不是我。 - Snowball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接