将foldr与Scheme中的或逻辑运算符一起使用

时间:2013-09-16 21:36:07

标签: scheme

我试图使用Dr.Racket

在Scheme中运行以下代码
(foldr or #f '(#f #f #f #t))

现在,我希望这可以工作,因为

(foldr + 0 '(1 2 3))

工作得很好,返回6.

但是当我尝试使用逻辑运行它时,或者我得到"或:语法不好:或者"

我做错了什么?另外,是否有一种替代方法可以在不使用折叠的情况下计算列表或列表?

2 个答案:

答案 0 :(得分:5)

在折叠or的特定情况下,您应该使用ormap。您可以将identity(或甚至values)作为与ormap一起使用的函数传递。

> (ormap identity '(#f #f #f #f #t))
#t
> (ormap identity '(#f #f #f #f #f))
#f

通常,您只能折叠函数,而不能折叠宏,而or是宏,因为它有短路行为。

答案 1 :(得分:1)

我的方案相当薄弱,但如果我没有弄错,或者是宏,而不是函数,那么你就不能在高阶调用中传递它。你可以把它包裹在一个lambda中,但是看起来不那么令人愉快:

(foldr (lambda (a b) (or a b)) #f '(#f #f #f #t)) => #t

如果您事先知道参数的数量,那么值得注意的是或者采用零个或多个参数:

(or) => #f
(or #f) => #f
(or #t) => #t
(or #t #f) => #t
(or #f #f #f #f #f) => #f

否则,你需要一个比我更有经验的Schemer来提供答案。