![](https://csdnimg.cn/release/download_crawler_static/88749578/bg4.jpg)
A. Cunha
,
J.Visser/Electronic Notes in Theoretical Computer Science 174
(
2007
)
17
迁移至:
getArtists
J
= List. map
(
fstsndsnd
)在第二
步之后,查询将迁移到:
getArtistsDB
=
elems
对象
映射。
map
(
snd
)
地图
在这里
,
elems是map上的一个标准函数,它返回map的范围, 一个列表(按键
的升序排列)和Map
。
map将其参数函数应用于每个范围元素。请注意,迁移的查
询不涉及作为中间格式的原始相册类型,也不根据迁移函数包装的原始查询进行定
义。
3
类型的表示
在我们将要定义的两个重写系统中,我们都需要访问值级别上的类型表示。无点表
达式的类型保持重写系统需要它们用于
类型导向的
重写决策,而类型改变重写系统
对类型本身执行重写。为了确保两个重写系统的类型安全,类型的通用表示并不存
在。
使用
广义代数数据类型
(
GADT
)
[22]
,
Haskell
类型系统的最新扩展,可以声明
一个参数化数据类型Type a,其居民必须是类型a的表示[12]:
data
Type a
where
Int
::
Type Int
String
::
Type
String One
::
Type
()
Either
::
Type a
→
Type b
→
Type
(
Either a b
)
Prod
::
Type a
→
Type b
→
Type
(
a
,
b
)
功能
::
类型
a
→
类型
b
→
类型
(
a
→
b
)
列表
::
类型
a
→
类型
[a]
Map
::
Type a
→
Type b
→
Type
(
Map a
b
)
Tag
::
String
→
Type a
→
Type a
注意,在这个声明中,参数化Type a的
Type
a在每个构造函数中受到不同的限制这正
是GADT和常规参数化数据类型之间的区别,在常规参数化数据类型中例如,类型
构造函数Int的类型为Type Int,而List Int的类型为Type[Int]。因此,GADTType a的
参数a允许我们携带必要的类型信息以确保类型安全。
类型
a允许表示一些基本类型,和,产品,函数,列表和有限映射
-
对于本文的目
的来说足够了,但如果需要,可以扩展到更多类型。Tag构造函数允许我们用名称
标记类型。例如,Albums的类型表示可以定义如下。
类别
:类别
:音乐