[英]racket: (my-filter p lst) function with lambda and foldr
我试图通过使用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将代码更改为一个?
提前致谢!
首先,我们需要了解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”函数,我们可以将filter编写为
(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 ...))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.