学习haskell的过程中了解其基本class,对'数'的定义有些让我费力, 经过仔细的思考有了一些新的认识,在此记录一下.废话很多.
Prelude库包含了对基本类型的定义
各种class:
Eq :
表示可判断等于的类型, 几乎任何基础的类型都可以等于一下.
Eq => Ord :
Ord是Eq的子集, 表示有序的,也就是互相之间可以比大小的.
Enum :
是可被枚举的. 和Ord有些类似,它用前驱和后继来表示相邻的元素,succ 1 = 2.
Bounded :
有界的. 定义了最大值和最小值. 但是并不一定是Ord的. Int8这类固定长度的是有界的,Integer和浮点则是无界的.
data Int Integer Float Double 都是定义
type Rational = Ratio Integer 引用了比例的Integer实例, 表示有理数.
更多class:
Eq,Show => Num :
数值.只定义了+-*操作,没有除.
Num,Ord => Real :
实数, 在数值的基础上加上有序的约束,实数一要能比相等,还能比大小.
Real,Enum => Integral :
整数, 在实数的基础上加上可枚举, 其实就是有前驱和后继. 整数的前驱和后继总是+1,-1, 而一般的实数则没有固定的前驱和后继.
Real => Fractional :
分数, 支持除法.
Fractional => Floating :
浮点数, 定义了很多运算,三角函数,e,π,幂运算.
Real,Fractional => RealFrac :
实数和分数的交集的子集, 可以理解为精度总是有限的数(可以有限表示).
RealFrac,Floating => RealFloat :
其实现仅仅有Float和Double, 包含了多种对浮点数据类型的函数, 和IEEE754紧密结合的.
正题:
Fractional翻译过来是分数,称其为小数在中文里不太恰当. 小数包含有限小数.无限循环小数和无限不循环小数. 无限不循环小数不是分数.
无限循环小数和有限小数是一码事,为什么呢.
分数就是两个整数相除,a/b.
如果a>=b, 可以用代分数来表示: x又a'/b,xb+a'=a.
a/b的小数表示等价于a'/b的小数表示.
那么就考虑a如果是1/2这样的形式,得到的是有限小数0.5.
如果是1/3这样的形式,得到的是无线循环小数0.33333循环.
但是,这只是10进制下的情况,如果改变数制, 比如3进制,那么1/3就是0.1了.
这样来看,对于无限循环小数之所以存在是由于当前的分母与数制互质造成的。
举例来说:2和10不互质,所以*/2都是有限小数。
而3和10互质,则*/3一定会出现无限循环小数。
所以无限循环小数和有限小数是一家,而无限不循环小数则是另一回事。
巴比伦人(好像)发明的60进制来记时间,就是因为60的与2 3 4 5 6都是相合的,非常方便得到各种精确的分割。试想如果一个小时有10分钟。那么一个小时干完三件事似乎总不能严格的描述。
所以说有理数,就是能够明确知道其大小的数。
阅读(1125) | 评论(0) | 转发(0) |