我想编写Racket函数的find-subsets。该函数将生成不包含辅助函数的数字列表的子集列表,并且仅使用lambda,cond,cons,rest,rest,first和其他原始函数。
例如,应满足以下检查要求:
Data.MonoTraversable.Unprefixed
基本上,此函数产生一组数字的幂集,但是我不确定它如何能产生所有元素,而无需递归。
#lang racket
(define-syntax-rule (my-let ([var val]) body)
((λ (var) body) val))
(define-syntax-rule (Y e)
((λ (f) ((λ (x) (f (λ (y) ((x x) y))))
(λ (x) (f (λ (y) ((x x) y))))))
e))
(define-syntax-rule (define/rec f e)
(define f (Y (λ (f) e))))
(define/rec my-append
(λ (l1)
(λ (l2)
(cond [(empty? l1) l2]
[else (cons (first l1) ((my-append (rest l1)) l2))]))))
(define/rec my-map
(λ (f)
(λ (l)
(cond [(empty? l) empty]
[else (cons (f (first l)) ((my-map f) (rest l)))]))))
(define/rec my-power-set
(λ (set)
(cond [(empty? set) (cons empty empty)]
[else (my-let ([rst (my-power-set (rest set))])
((my-append ((my-map (λ (x) (cons (first set) x))) rst))
rst))])))
摘要:
我从here和curried中采用了幂集的标准定义。然后,我将let,append和map替换为my-let,my-append和my-map。我将Y combinator定义为Y
宏,并将帮助器define/rec
定义为递归函数。然后,我使用define/rec
宏定义了my-append和my-map(请注意,它们也被管理)。我们可以替换所有内容以获得所需的代码。