我正在尝试使用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将代码更改为一个?
提前致谢!
答案 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 ...))