【问题标题】:Racket - How to use foldr to evaluate if any element in a list satisfies an argument?Racket - 如何使用 foldr 来评估列表中的任何元素是否满足参数?
【发布时间】:2015-06-05 22:07:25
【问题描述】:

我的任务是编写一个名为 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,然后将其替换为 y,这是无效的,因为您需要一个列表来运行递归调用。

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

【问题讨论】:

    标签: recursion racket fold


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!我正在阅读有关 fold 的更多信息,我不敢相信我没有看到那部分
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2012-10-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多