那么,当给定两个列表时,如何仅使用map、filter或foldr从另一个列表中删除元素?我也不能使用显式递归或lambda。
这些列表只包含按升序排序的数字。
例如,如果给定(list 1 2 3)和(list 1 3 5),我希望从第一个列表中删除第二个列表的所有元素。我想要的输出是(列表2)。如果给定(列表4 5 6)和(列表2 3 5),我将得到(列表4 6)。
我猜最终的代码应该是这样的:
(define (fn-name list-one list-two)
(filter ... list-one))谢谢!
发布于 2015-07-26 08:19:55
考虑到你正在使用SRFI-26,我们可以根据一些内置的抽象列表函数编写一个简单的解决方案,而不需要使用显式的lambda,我们只需要一点来自球拍的帮助。试试这个:
(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)发布于 2015-07-26 04:19:40
您可以使用filter,但您必须对member执行curry和invert操作,因此如果没有filter,您将无法完成这项工作。
(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中的显式/。在您自己的示例中,您也使用了lambda一次,因为(define (name . args) . body)与(define name (lambda args . body))相同
https://stackoverflow.com/questions/31630596
复制相似问题