我正在尝试使用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))
但不幸的是,它总是返回给定的列表。
我很乐意得到一些帮助,因为我做错了什么,为什么过滤没有发生。 谢谢!
答案 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)