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/2 和 12 % (-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月