文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.1 抽象数据类型
我们先来讨论抽象数据类型(ADT)。ADT 是隐藏其表示、只提供对值的操作的数据类型。
例如, 整数的集合 ADT 可以定义如下:
adt Set 是
empty : Set
insert : Set x Int -> Set
isEmpty? : Set -> Bool
contains? : Set x Int -> Bool
这种整数集 ADT 有许多可能的表示。例如,可以使用 Scheme 的表来实现它:
(define empty '())
(define (insert set val)
(if (not (contains? set val))
(cons val set)
set))
(define (isEmpty? set) (null? set))
(define (contains? set val)
(if (null? set) #f
(if (eq? (car set) val)
#t
(contains? (cdr set) val))))
客户程序可以使用 ADT 值,而无需知道底层的表示法:
> (define x empty)
> (define y (insert x 3))
> (define z (insert y 5))
> (contains? z 2)
#f
> (contains? z 5)
#t
我们也可以用另一种表示方式来实现 ADT 集合,比如使用 PLAI 的 define-type 机制来创建一个变体类型,将集合编码为链表。
(define-type Set
[mtSet]
[aSet (val number?) (next Set?)])
(define empty (mtSet))
(define (insert set val)
(if (not (contains? set val))
(aSet val set)
set))
(define (isEmpty? set) (equal? set empty))
(define (contains? set val)
(type-case Set set
[mtSet () #f]
[aSet (v next)
(if (eq? v val)
#t
(contains? next val))]))
前面的示例客户程序运行照旧,即使现在底层表示换掉了:
> (define x empty)
> (define y (insert x 3))
> (define z (insert y 5))
> (contains? z 2)
#f
> (contains? z 5)
#t
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论