Scheme中的Filter-Out功能

时间:2013-12-11 20:41:31

标签: recursion filter functional-programming scheme predicate

我需要创建一个过滤掉Scheme中谓词的函数。例如(filter-out number? '(a 2 #f b 7)):输出为(a #f b)

我所拥有的功能会返回已过滤掉的内容列表。我怎样才能改变这个以获得我需要的东西?感谢

(define (filter pred lst)
  (reverse (filter-help pred lst '())))

(define (filter-help pred lst res)
  (cond ((null? lst) res)
        ((pred (car lst)) 
           (filter-help pred (cdr lst)  (cons (car lst) res)))
        (else 
           (filter-help pred (cdr lst)  res))))

1 个答案:

答案 0 :(得分:0)

如果您只是在一行filter-help上取消谓词(并按预期将filter更改为filter-out),那么您的函数会起作用:

(not (pred (car lst)))

而不是

((pred (car lst))

虽然您可以使用带有lambda函数的内置filter来更简单地写这个:

(define (alt-filter-out pred lst)
        (filter (lambda (x) (not (pred x))) lst))

希望这有帮助!