在 Scheme 中使用 foldr 过滤列表

Filter list using foldr in Scheme

我正在尝试在 Scheme 中使用 "foldr" 过滤列表,并只保留列表中包含某些给定谓词的 return "true" 的元素。 我尝试使用之前关于方案中 foldr/l 的讨论(例如,this one),并得出以下代码:

(define (filterb pred? lst)
 (foldr (lambda (e a)
       (if (pred? e)
           (cons e a)
           a))
     lst
     '()))

运行命令例如:

(filterb even? '(1 2 3 4))

但不幸的是,它总是 return 给定的列表。

我很乐意就我做错了什么以及为什么没有进行过滤获得一些帮助。 谢谢!

documentation中所述,foldr通常将参数作为一个过程、一个初始值和一个输入列表,顺序为。您的代码大部分是正确的,除了传递给 foldr 的最后两个参数被反转。如评论中所述,您只需颠倒顺序即可:

(define (filterb pred? lst)
  (foldr (lambda (e a)
           (if (pred? e)
               (cons e a)
               a))
         '()
         lst))

它按预期工作:

(filterb even? '(1 2 3 4))
=> '(2 4)