哈斯克尔98报告
顶部|后面|下一个|目录|功能索引
15 索引编制操作
模块Ix(Ix(范围、索引、范围、范围大小)),其中
类Ord a=>Ix a其中 范围::(a,a)->[a] 索引::(a,a)->a->Int 范围::(a,a)->a->布尔 范围大小::(a,a)->Int
实例Ix字符,其中。。。 实例Ix Int,其中。。。 实例Ix整数,其中。。。 实例(Ix a,Ix b)=>Ix(a,b)其中。。。 --等等 实例Ix Bool其中。。。 实例Ix排序,其中。。。
|
这个Ix公司类用于映射键入整数。它主要用于数组索引(请参见第章16).这个Ix公司类包含方法范围,指数、和英寸范围. 这个指数操作映射一个边界对,该边界对定义了和范围的上限,以及下标为整数。这个范围操作枚举所有下标;这个英寸范围操作告知特定下标是否位于边界对定义的范围内。实施有权假定以下有关这些的法律操作:
范围(l,u)!!索引(l,u)i==i——当i在范围内时
inRange(l,u)i==i`元素`范围(l,u)
地图索引(范围(l,u))==[0..rangeSize(l,u)]
15.1 派生的实例Ix公司
可以导出Ix公司自动,使用一衍生条款数据声明(第节4.3.3).类的此类派生实例声明Ix公司只有可能用于枚举(即具有仅nullary构造函数)和单构造函数数据类型,其组成类型是Ix公司.Haskell实现必须提供Ix公司大小至少为15的元组的实例。
- 对于枚举,假定nullary构造函数为从左到右编号,索引为0到n-1(包括0和n-1)。这与枚举类。例如,给定数据类型:
数据颜色=红色|橙色|黄色|绿色|蓝色|靛蓝|紫色
我们会:
范围(黄色、蓝色)==[黄色、绿色、蓝色]
指数(黄色、蓝色)绿色==1
inRange(黄色、蓝色)红色==假
- 对于单构造函数数据类型,派生实例声明如中的元组所示图15.1.
实例(Ix a,Ix b)=>Ix(a,b),其中 范围((l,l'),(u,u')) =[(i,i')|i<-range(l,u),i'<-rangion(l',u')] 索引((l,l'),(u,u'))(i,i') =索引(l,u)i*范围大小(l',u')+索引(l'、u')i' in范围((l,l'),(u,u'))(i,i') =输入范围(l,u)i&&输入范围(l',u')i'
--其他元组的实例从该方案中获得: -- --实例(Ix a1,Ix a2,…,Ix ak)=>Ix(a1,a2,..,ak),其中 --范围((l1,l2,…,lk),(u1,u2,……,uk)= --[(i1,i2,…,ik)|i1<-范围(l1,u1), --i2<-范围(l2,u2), -- ... --ik<-范围(lk,uk)] -- --索引((l1、l2、…、lk)、(u1、u2、……、uk))(i1、i2、…,ik)= --索引(lk,uk)ik+范围大小(lk、uk)*( --索引(lk-1,uk-1)ik-1+范围大小(lk-1,uk-1)*( -- ... --索引(l1,u1)) -- --英寸范围((l1,l2,…lk),(u1,u2,…,uk))(i1,i2,……,ik)= --范围(l1,u1)i1和范围(l2,u2)i2&& -- ...范围(lk,uk)ik
|
Ix实例的派生
|
15.2 图书馆Ix公司
模块Ix(Ix(范围、索引、范围、范围大小)),其中
类Ord a=>Ix a其中
范围::(a,a)->[a]
索引::(a,a)->a->Int
范围::(a,a)->a->布尔
范围大小::(a,a)->Int
rangeSize b@(l,h)|null(range b)=0
|否则=指数b h+1
--注:将“null(range b)”替换为“not(l<=h)”
--如果边界是元组,则失败。例如,
-- (1,2) <= (2,1)
--但范围仍然是空的
--范围((1,2),(2,1))=[]
实例Ix字符,其中
范围(m,n)=[m.n]
索引b@(c,c')ci
|inRange b ci=fromEnum ci-fromEnume c
|否则=error“Ix.index:索引超出范围。”
in范围(c,c')i=c<=i&&i<=c'
实例Ix Int,其中
范围(m,n)=[m.n]
指数b@(m,n)i
|in范围b i=i-m
|否则=错误“Ix.index:索引超出范围。”
in范围(m,n)i=m<=i&&i<=n
实例Ix整数,其中
范围(m,n)=[m.n]
指数b@(m,n)i
|范围b i=fromInteger(i-m)
|否则=错误“Ix.index:索引超出范围。”
in范围(m,n)i=m<=i&&i<=n
instance(Ix a,Ix b)=>Ix(a,b)--派生的,用于所有元组
实例Ix Bool--派生
实例Ix排序--派生
实例Ix()--派生
Haskell 98报告
顶部|后面|下一个|目录|功能索引
2002年12月