在 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)
我正在尝试在 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)