【问题标题】:Filter list using foldr in Scheme在 Scheme 中使用 foldr 过滤列表
【发布时间】:2017-03-18 07:55:38
【问题描述】:

我正在尝试在 Scheme 中使用“foldr”过滤列表,并仅保留列表中的元素为某些给定谓词返回“true”。 我尝试使用前面关于 foldr/l in scheme 的讨论(例如,this one),并得出以下代码:

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

运行命令例如:

(filterb 偶数?'(1 2 3 4))

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

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

【问题讨论】:

  • foldr 通常不会按此顺序获取其参数。检查您的文档。
  • 谢谢!就是这样……

标签: scheme fold


【解决方案1】:

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

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

它按预期工作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    相关资源
    最近更新 更多