List Racket博士:使用抽象列表函数从列表中删除元素

List Racket博士:使用抽象列表函数从列表中删除元素,list,scheme,racket,List,Scheme,Racket,所以,当给定两个列表时,如何仅使用map、filter或foldr从一个列表中删除另一个列表中的元素?我也不能使用显式递归或lambda 列表仅由按升序排序的数字组成 例如,如果给定(列表1 2 3)和(列表1 3 5),我想从第一个列表中删除第二个列表的所有元素。我想要的输出是(列表2)。 如果给出(列表456)和(列表235),我会得到(列表456) 我猜最终的代码是这样的: (define (fn-name list-one list-two) (filter ... list-o

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

列表仅由按升序排序的数字组成

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

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

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

谢谢

您使用过滤器,但必须对
成员进行curry和inverse操作,因此如果没有
lambda
,则无法执行此操作

(定义(删除堆栈中的元素)
(过滤器(λ(x)(非(成员…)
干草堆)
(定义(删除干草堆中的元素)
(定义(不在针x中)
(不是(成员…)
(过滤器不在干草堆中)

这两种方法都使用
lambda
两次!一次用于
定义
删除元素
,一次用于
中的显式/非显式
。在您自己的示例中,您也使用了
lambda
,因为
(define(name.args).body)
(define name(lambda args.body))

如果您使用的是Racket,我们可以根据一些内置的抽象列表函数编写一个简单的解决方案,而无需使用显式
lambda
s,我们只需要你的一点帮助。试试这个:

(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)