繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM