哈斯克尔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的元组的实例。


实例(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月