返回介绍

3.2 用子程序表示

发布于 2025-02-20 00:17:06 字数 1304 浏览 0 评论 0 收藏 0

我们也可以把集合看作是由它的 特征函数 定义:该函数读入一个数字,告诉我们这个数字是否是集合的一部分。在这种情况下,集合就是简单的 Int -> Bool 函数。(PLAI 一书中,第十二章中在研究环境的 子程序表示 时有提到。)

空集的特征函数是什么?总是返回假的函数。插入一个新元素所获得的集合呢?

(define empty (λ (n) #f))

(define (insert set val)
          (λ (n)
            (or (eq? n val)
                (contains? set n))))

(define (contains? set val)
  (set val))

由于集合由其特征函数表示, contains? 只需将该函数应用于该元素。请注意,客户程序还是完全不受干扰:

> (define x empty)
> (define y (insert x 3))
> (define z (insert y 5))
> (contains? z 2)
#f
> (contains? z 5)
#t

集合的子程序表示给我们带了了什么?灵活性!例如,我们可以定义所有偶数的集合:

(define even
  (λ (n) (even? n)))

我们前面考虑的任何 ADT 表示,都不能完整地表示这个集合。(为什么?)我们甚至可以定义非确定的集合:

(define random
  (λ (n) (> (random) 0.5)))

使用子程序表示,我们可以更自由地定义集合,此外它们同样可以与已有的集合操作交互!

> (define a (insert even 3))
> (define b (insert a 5))
> (contains? b 12)
#t
> (contains? b 5)
#t

相反,在上面我们看到的 ADT 表示中,不同的表示法之间不能互操作。列表实现集合的值不能被结构体实现的操作使用,反之亦然。ADT 从表示中抽象出来,但一次只允许 一种表示

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文