2015-06-05 16 views
1

我的任務是編寫一個名爲any?的程序,它需要輸入一個列表和一個參數的過程,然後告訴您該列表中的任何元素是否滿足該過程。球拍 - 如何使用foldr來評估列表中的任何元素是否滿足參數?

例如:(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相似:第三個參數必須是一個列表,提供虛假」。我認爲這是因爲空的基本情況變成布爾型的假,然後用y代替,這是無效的,因爲你需要一個列表來運行遞歸調用。

有人可以幫助我通過思考過程來解決這個問題嗎?

回答

5

foldr爲你處理遞歸;你不應該在lambda的內部再次呼叫any?。相反,假分支可以是y

或者,有些更明顯,或許:

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

此外,你得到的錯誤是因爲lambday裏面是一個布爾值。然後,您將其作爲第二個參數傳遞給any?,您期待列表。悲傷的結果。

+0

謝謝!我正在讀更多的關於摺疊,我不相信我沒有看到這一部分 – gurdingering