如何从列表中删除布尔值

时间:2014-07-09 10:17:27

标签: scheme racket

因此,对于我的作业,给定测试和操作,我必须计算仅在通过测试的元素上执行操作的列表。一个例子是: (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)))时,列表不会改变。有什么东西我没看错吗?

1 个答案:

答案 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)