Racket - 如何使用foldr来评估列表中的任何元素是否满足参数?

时间:2015-06-05 22:07:26

标签: recursion racket fold

我的任务是编写一个名为any?的程序,该程序需要输入一个列表和一个参数的过程,然后告诉你该列表中的任何元素是否满足该过程。

例如:(any? odd? (list 2 4 6 8)) - >假

我需要在程序中使用foldr。

(define (any? procedure list1)
  (foldr (lambda (x y) (if (procedure x) true (any? procedure y))) false list1))

这是我到目前为止所做的,但是当我在(any? odd? (list 2 4 6 8))上运行程序时,我不断收到错误说" foldr:第三个参数必须是一个列表,给定为false"。我认为这是因为空的基本情况变为布尔值false,然后替换为y,这是无效的,因为您需要一个列表来运行递归调用。

有人可以帮助我完成思考过程吗?

1 个答案:

答案 0 :(得分:5)

foldr为你处理递归;你不应该在any?内再次呼叫lambda。相反,假分支可以是y

或者,或许更明显一点,或许:

(define (any? procedure lst)
  (foldr (lambda (x y) (or (procedure x) y)) #f lst))

此外,您获得的错误是因为在lambda内部,y是一个布尔值。然后,您将其作为第二个参数传递给any?,您需要一个列表。悲伤的结果。