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

Racket - How to use foldr to evaluate if any element in a list satisfies an argument?

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

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

我需要在程序中使用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 : third argument must be a list, given false"。我认为这是因为 empty 的基本情况变为布尔值 false,然后用它代替 y,这是无效的,因为您需要一个列表来 运行 递归调用。

有人可以帮我解决这个问题吗?

foldr 为您处理递归;你不应该在 lambda 中再次调用 any?。相反,假分支可以只是 y.

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

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

此外,您收到的错误是因为 lambday 内部是一个布尔值。然后,您将它作为第二个参数传递给 any?,在那里您需要一个列表。悲伤的结果。