使用Scheme中的foldr过滤列表

时间:2017-03-18 07:55:39

标签: scheme fold

我正在尝试使用Scheme中的“foldr”过滤列表,并将列表仅保留为某些给定谓词返回“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))

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

我很乐意得到一些帮助,因为我做错了什么,为什么过滤没有发生。 谢谢!

1 个答案:

答案 0 :(得分:1)

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)