球拍功能,是错还是我错过了什么

时间:2014-02-14 22:16:53

标签: lambda functional-programming scheme racket

在球拍的书中发现了这个功能:

(define (my-filter pred lst)
  (cond [(empty? lst) empty]
        [(pred (first lst))
         (cons (first lst) (my-filter (rest lst)))]
        [else (my-filter (rest lst))]))

用以下方式调用:

(my-filter (lambda (i) (> i 5)) `(1 2 3 4 5 6 7 8))

给出:

my-filter: arity mismatch;
 the expected number of arguments does not match the given number
  expected: 2
  given: 1
  arguments...:
   '(2 3 4 5 6 7 8)

所以我改成了:

(define (my-filter pred lst)
  (cond [(empty? lst) empty]
        [(pred (first lst))
         (cons (first lst) (my-filter pred (rest lst)))]
        [else (my-filter pred (rest lst))]))

现在它工作正常。所以,如果我在那里错过任何东西,或者这本书是错的,我就会徘徊?

1 个答案:

答案 0 :(得分:3)

事实证明这本书是错的。在球拍home page中发现了这一点。我认为这可能是我不理解的事情,因为这是我第一天做球拍。

  

第114页my-filter函数的定义有两个   参数,但重复时只提供一个参数。定义   应阅读:

(define (my-filter pred lst)
  (cond [(empty? lst) empty]
        [(pred (first lst))
         (cons (first lst) (my-filter pred (rest lst)))]
        [else (my-filter pred (rest lst)))))