有人可以向我解释这个输出吗?我在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
GHC版本7.4.1,Ubuntu
答案 0 :(得分:7)
这是因为o
类型Int
的范围有限,因此(mod (o^2087) 9797)
也是Int
。但是,常量102
属于通用数字类型(Num a => a
),而(mod (102^2087) 9797)
属于通用整数类型(Integral a => a
)。如果必须将此通用整数类型解析为具体类型(在应用print
时发生),则默认解决方案是选择Integer
,这是一种无界积分类型。有关此决议的详细信息,请参阅4.3.4 Ambiguous Types, and Defaults for Overloaded Numeric Operations的Haskell 2010 Report部分。
答案 1 :(得分:0)
首先,ord
是一个返回字符数字表示的函数,在本例中为102.
您的第一行(print (o==102)
)正在检查o
是否等于102
,因此输出True
。
第二行(print (mod (102^2087) 9797)
)将两个参数应用于mod
函数。当第一个参数除以第二个参数时,mod
函数返回余数。这是integer division因此不允许使用小数部分。插入符号运算符(^
)表示exponent已被占用。即“102到2087的力量”。
最后一行(print (mod (o^2087) 9797)
)与第二行的作用相同,但参数不同。
希望这很清楚!