首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用单个foldr调用编写过滤器?

使用单个foldr调用编写过滤器?
EN

Stack Overflow用户
提问于 2016-02-19 21:58:17
回答 2查看 560关注 0票数 1

目的是编写过滤器函数,只使用一个没有递归的foldr调用或任何其他高阶过程(map、map、apply等)。

目前我正在使用

代码语言:javascript
复制
  (define (filter ps xs)
    (if (empty? xs)
        ps
        (foldr (lambda (p y)
                 (if (andmap p xs)
                     (cons p y)
                     y))
               '()
               ps)))

然而,它使用的是andmap函数,它被认为是一种高阶过程。

目标是拥有

代码语言:javascript
复制
(filter positive? '(-1 2 3 4 -5 -6)) 
=> '(2 3 4)

只需一次呼救

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-19 22:23:36

我认为您误解了foldr是如何工作的,您必须将列表作为最后一个参数进行处理,为了实现过滤器,对要测试的每个元素应用ps。最好试试这样的方法:

代码语言:javascript
复制
(define (filter ps xs)
  (foldr (lambda (p y)
           (if (ps p)
               (cons p y)
               y))
         '()
         xs))

它如预期的那样运作:

代码语言:javascript
复制
(filter positive? '(-1 2 3 4 -5 -6)) 
=> '(2 3 4)
票数 3
EN

Stack Overflow用户

发布于 2016-02-20 02:09:13

这听起来像是家庭作业。我能理解为什么选择foldr,但为了看到它用foldl实现,请看这里

代码语言:javascript
复制
(define (filter f xs)
  (reverse (foldl (λ (x ys) (if (f x) (cons x ys) ys))
                  null
                  xs)))

(filter positive? '(-1 2 3 4 -5 -6)) 
;=> '(2 3 4)

foldlfoldr相比有明显的优势,因为它是通过适当的尾调用来实现的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35515832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档