1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用函数式来实现集合

Posted on 2012-09-27 10:50  1957  阅读(235)  评论(0编辑  收藏  举报

Set很常见的数据类型,一般情况下可以用平衡二叉树,或者hash实现的。

习惯了这种思维,所以一开始用函数式方法去实现的时候显得很没头绪。

-------------------------------------------------

只是用于练习函数式编程,和效率无关,这种实现效率不高。

-------------------------------------------------

在函数式编程里面一切皆函数,所以我们的集合元素也可以看做是函数

 

在构建单个集合时(就是集合的元素)

输入elem,返回x == elem的函数

(define (singletonSet elem)
  (lambda (x) (= x elem)))

使用的时候就可以这样

(define s (singletoSet 1))

(s 1) ;;; #t

(s 2) , (s 3) ;;;#f

(define (contains set a)
  (set a))

 

这就是单个元素,那么把多个整合起来怎么做呢?

其实就是逻辑运算的或运算就ok

(define (union set1 set2)
  (lambda (x) (or (set1 x)  (set2 x))))

 

ok,那再实现点其他功能。。。

#lang racket
(define (singletonSet elem)
  (lambda (x) (= x elem)))

(define (contains set a)
  (set a))

(define (union set1 set2)
  (lambda (x) (or (set1 x)  (set2 x))))

(define (intersect set1 set2)
  (lambda (x) (and (set1 x) (set2 x))))

(define (diff set1 set2)
  (lambda (x) (and (set1 x) (not (set2 x)))))

(define (filter set p)
  (lambda (x) (and (set x) (p x))))