racket :( my-filter p lst)函数与lambda和foldr

时间:2016-06-10 09:13:18

标签: list lambda racket

我正在尝试使用lambda,map和foldr来实现一个函数(my-filter p lst)。

到目前为止我所拥有的是:

(define (my-filter1 p lst)
  (cond [(empty? lst) empty]
        [(p (first lst))
         (cons (first lst) (my-filter1 p (rest lst)))]
        [else (my-filter1 p (rest lst))]))

它工作正常,但我如何使用lambda,map和foldr将代码更改为一个?

提前致谢!

1 个答案:

答案 0 :(得分:3)

首先,我们需要了解foldr的工作原理。

  (foldr k e '(1 2 3))
= (k 1 (k 2 (k 3 e)))

有助于将k视为cons,将e视为empty。 例如:

  (foldr cons empty '(1 2 3))
= (cons 1 (cons 2 (cons 3 empty)))
= (list 1 2 3)

要制作过滤器,我们只需要使用“缺点” 如果满足谓词,则在元素前面添加元素。

(define (kons x xs)
  (if (p x)           ; where p is the predicate
      (cons x xs)
      xs))

鉴于这种自定义“cons”功能,我们可以将过滤器编写为

 (foldr kons empty '(1 2 3))

一个完整的例子:

#lang racket

(define p odd?)

(define (kons x xs)
  (if (p x)
      (cons x xs)
      xs))

(foldr kons empty '(1 2 3 4 5 6))

结果是:

 '(1 3 5)

要将此功能转换为过滤功能,请使用以下模板:

(define (my-filter p xs)
   (define (kons x xs) ...)
   (foldr ...))