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