首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dr.racket:使用抽象列表函数从列表中删除元素

Dr.racket:使用抽象列表函数从列表中删除元素
EN

Stack Overflow用户
提问于 2015-07-26 04:03:46
回答 2查看 2K关注 0票数 1

那么,当给定两个列表时,如何仅使用map、filter或foldr从另一个列表中删除元素?我也不能使用显式递归或lambda。

这些列表只包含按升序排序的数字。

例如,如果给定(list 1 2 3)和(list 1 3 5),我希望从第一个列表中删除第二个列表的所有元素。我想要的输出是(列表2)。如果给定(列表4 5 6)和(列表2 3 5),我将得到(列表4 6)。

我猜最终的代码应该是这样的:

代码语言:javascript
复制
(define (fn-name list-one list-two)
    (filter ... list-one))

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-07-26 08:19:55

考虑到你正在使用SRFI-26,我们可以根据一些内置的抽象列表函数编写一个简单的解决方案,而不需要使用显式的lambda,我们只需要一点来自球拍的帮助。试试这个:

代码语言:javascript
复制
(require srfi/26)

(define (difference lst1 lst2)
  (filter-not (cut member <> lst2) lst1))

它的工作方式与预期一致:

代码语言:javascript
复制
(difference (list 1 2 3) (list 1 3 5))
=> '(2)

(difference (list 4 5 6) (list 2 3 5))
=> '(4 6)
票数 1
EN

Stack Overflow用户

发布于 2015-07-26 04:19:40

您可以使用filter,但您必须对member执行curry和invert操作,因此如果没有filter,您将无法完成这项工作。

代码语言:javascript
复制
(define (remove-elements needles haystack)
  (filter (lambda (x) (not (member ...))) 
          haystack))


(define (remove-elements needles haystack)
  (define (not-in-needles x)
    (not (member ...)))

  (filter not-in-needles haystack))

这两种方法都使用了两次lambda!一次用于remove-elementsdefine,一次用于not-in-needles中的显式/。在您自己的示例中,您也使用了lambda一次,因为(define (name . args) . body)(define name (lambda args . body))相同

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

https://stackoverflow.com/questions/31630596

复制
相关文章

相似问题

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