一堆数字列表

  

我想编写Racket函数的find-subsets。该函数将生成不包含辅助函数的数字列表的子集列表,并且仅使用lambda,cond,cons,rest,rest,first和其他原始函数。

例如,应满足以下检查要求:

Data.MonoTraversable.Unprefixed

基本上,此函数产生一组数字的幂集,但是我不确定它如何能产生所有元素,而无需递归。

nichua11 回答:一堆数字列表

#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))])))

摘要: 我从herecurried中采用了幂集的标准定义。然后,我将let,append和map替换为my-let,my-append和my-map。我将Y combinator定义为Y宏,并将帮助器define/rec定义为递归函数。然后,我使用define/rec宏定义了my-append和my-map(请注意,它们也被管理)。我们可以替换所有内容以获得所需的代码。

本文链接:https://www.f2er.com/3077364.html

大家都在问