Haskell 98报告
顶部|后面|下一个|目录|功能索引

12  有理数


模块比率(
比率,有理,(%),分子,分母,近似有理),其中

中缀7%
数据(积分a)=>比率a=。。。
类型有理=比率整数
(%)::(积分a)=>a->a->比率a
分子、分母::(积分a)=>比率a->a
近似推理::(RealFrac a)=>a->a->推理
实例(积分a)=>等式(比率a),其中。。。
instance(Integral a)=>Ord(Ratio a)其中。。。
实例(积分a)=>数字(比率a),其中。。。
实例(积分a)=>实(比率a),其中。。。
实例(积分a)=>分数(比率a),其中。。。
实例(积分a)=>RealFrac(比率a),其中。。。
实例(积分a)=>枚举(比率a),其中。。。
实例(读取a,积分a)=>读取(比率a),其中。。。
实例(积分a)=>显示(比率a),其中。。。

对于每个完整的类型t,有一种类型比率有理数对的t与分量类型t。类型名称理性是的同义词比率整数.

比率是类的实例等式,订单,号码,真实,分数的,RealFrac公司,枚举,阅读、和显示在每种情况下,的实例比率t只是“提升”相应的操作在t上。如果t是有界类型,则结果可能是不可预测的;例如比率Int甚至可能导致整数溢出绝对大小较小的有理数。

操作员(%)形成二的比率整数,将分数减为无公因数项分母为正。功能分子分母提取比率;这些是一个正分母的简化形式。比率是抽象类型。例如,12 % 8减至3/212 % (-8)减少到(-3)/2。

这个近似理性函数,应用于两个实数分数x个ε,返回open中最简单的有理数间隔(x个-ε,x个+ε).有理数无日期以简化形式称为比另一个简单n’/d’如果|n|<=|n'|d≤d’.注意,可以证明任何实数区间都包含唯一的最简单的理性。

12.1  图书馆比率


--有理数的标准函数

模块比率(
比率,有理,(%),分子,分母,近似有理),其中

中缀7%

ratPrec=7::整数

data(积分a)=>比率a=!a:%!a推导(等式)
类型Rational=比率整数

(%)::(积分a)=>a->a->比率a
分子、分母::(积分a)=>比率a->a
近似有理数::(RealFrac a)=>a->a->Rational


--“reduce”是仅在本模块中使用的辅助功能。
--它通过两个分子的除法使比率正常化
--分母为最大公约数。
--
--例如,12`reduce`8==3:%2
--12 `减少`(-8)==3:%(-2)

reduce _ 0=error“比率.%:零分母”
减少x y=(x`quot`d):%(y`quot` d)
其中d=gcd x y

x%y=减少(x*符号y)(abs y)

分子(x:%_)=x

分母(_:%y)=y


实例(积分a)=>Ord(比率a),其中
(x:%y)<=(x':%y')=x*y'<=x'*y
(x:%y)<(x':%y')=x*y'<x'*y

实例(积分a)=>数字(比率a),其中
(x:%y)+(x':%y')=减少(x*y'+x'*y)(y*y')
(x:%y)*(x':%y')=减少(x*x')(y*y')
取反(x:%y)=(-x):%y
abs(x:%y)=abs x:%y
符号(x:%y)=符号x:%1
fromInteger x=fromIntiger x:%1

实例(积分a)=>实(比率a),其中
toRational(x:%y)=toInteger x:%toIntegery

实例(积分a)=>分数(比率a),其中
(x:%y)/(x':%y')=(x*y')%(y*x')
倒数(x:%y)=y%x
fromRational(x:%y)=fromInteger x:%fromIntiger y

实例(积分a)=>RealFrac(比率a),其中
properFraction(x:%y)=(来自积分q,r:%y)
其中(q,r)=quotRem x y

实例(积分a)=>枚举(比率a),其中
成功x=x+1
pred x=x-1
toEnum=from积分
fromEnum=fromInteger。truncate—可能溢出
enumFrom=numericEnumFrom--这些numericEnumXXX函数
enumFromThen=numericEnumFromThen——如前奏曲中所定义
enumFromTo=numericEnumFromTho--但未从中导出!
enumFromTheTo=numericEnumFromtheTo

实例(读取a,积分a)=>读取(比率a),其中
readsPrec p=读Paren(p>ratPrec)
(\r->[(x%y,u)|(x,s)<-readsPrec(ratPrec+1)r,
(“%”,t)<-lex s,
(y,u)<-readsPrec(ratPrec+1)t])

实例(积分a)=>显示(比率a),其中
showsPrec p(x:%y)=showParen(p>ratPrec)
(显示Prec(ratPrec+1)x。 
showString“%”。 
显示Prec(ratPrec+1)y)



approxRational x eps=最简单(x-eps)(x+eps)
其中最简单的x y | y<x=最简单的y x
| x==y=xr
|x>0=最简单的“n d n”d
|y<0=-最简单的'(-n')d'(-n)d
|否则=0:%1
其中xr@(n:%d)=toRational x
(n’:%d’)=到有理y

最简单的“n d n”d--假定0<n%d<n“%d”
| r==0=q:%1
|q/=q'=(q+1):%1
|否则=(q*n“+d”):%n“”
其中(q,r)=引用n d
(q’,r’)=引用n’d’
(n'':%d'')=最简单的'd'r'd r


Haskell 98报告
顶部|后面|下一个|目录|功能索引
2002年12月