因此,对于我的作业,给定测试和操作,我必须计算仅在通过测试的元素上执行操作的列表。一个例子是: (selective-map cons?length(list(list 1 2)empty(list 3)))=> (清单2 1)
我在尝试删除我的测试失败时遇到了一些麻烦。到目前为止我所拥有的是
(define (testfunc test lst2)
(cond
[(null? lst2) null]
[(false? (map (compose test) (first lst2))) (remove* (list (first lst2)) (lst2))]
[else (cons (first lst2) (testfunc test (rest lst2)))]))
当我输入以下内容来测试我的代码(testfunc cons? (list (list 1 2) '() (list 3)))
时,列表不会改变。有什么东西我没看错吗?
答案 0 :(得分:2)
递归是错误的(您必须测试每个元素的谓词,为什么map
?),这不是删除元素的正确方法,testfunc
不一样如selective-map
,他们甚至不会收到相同数量的论点。让我们从头开始重试:
(define (selective-map test proc lst)
(cond
[(null? lst) null]
[(not (test (first lst)))
; to remove an element we simply don't add it to the output list
(selective-map test proc (rest lst))]
[else
; on the other hand, an element that passes the test is consed to the output list
(cons (proc (first lst)) (selective-map test proc (rest lst)))]))
更惯用的解决方案是使用折叠过程,而不是显式递归:
(define (selective-map test proc lst)
(foldr (lambda (e acc)
(if (test e)
(cons (proc e) acc)
acc))
null
lst))
无论哪种方式,它都按预期工作:
(selective-map cons? length (list (list 1 2) empty (list 3)))
=> '(2 1)