繁体   English   中英

Racket博士:使用抽象列表功能从列表中删除元素

[英]Dr. Racket: Removing elements from a list using abstract list functions

因此,当给定两个列表时,如何仅使用地图,过滤器或文件夹将一个列表中的元素从另一个列表中删除? 我也不能使用显式递归或lambda。

列表仅包含按升序排列的数字。

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

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

(define (fn-name list-one list-two)
    (filter ... list-one))

谢谢!

鉴于您正在使用Racket,我们可以根据一些内置的抽象列表函数编写一个简单的解决方案,而无需使用显式的lambda ,我们只需要SRFI-26的一点帮助SRFI-26 尝试这个:

(require srfi/26)

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

它按预期工作:

(difference (list 1 2 3) (list 1 3 5))
=> '(2)

(difference (list 4 5 6) (list 2 3 5))
=> '(4 6)

您使用filter,但是必须咖喱和倒置member所以如果没有lambda ,您将无法做到。

(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-elements define ,一次是显式/ not-in-needles 在您自己的示例中,由于(define (name . args) . body)(define name (lambda args . body))相同,因此您也使用了lambda (define name (lambda args . body))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM