奇怪的Haskell / GHC输出

时间:2012-08-24 16:14:11

标签: haskell

有人可以向我解释这个输出吗?我在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

2 个答案:

答案 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 OperationsHaskell 2010 Report部分。

答案 1 :(得分:0)

首先,ord是一个返回字符数字表示的函数,在本例中为102.

  1. 您的第一行(print (o==102))正在检查o是否等于102,因此输出True

    < / LI>
  2. 第二行(print (mod (102^2087) 9797))将两个参数应用于mod函数。当第一个参数除以第二个参数时,mod函数返回余数。这是integer division因此不允许使用小数部分。插入符号运算符(^)表示exponent已被占用。即“102到2087的力量”。

  3. 最后一行(print (mod (o^2087) 9797))与第二行的作用相同,但参数不同。

  4. 希望这很清楚!