Scheme/Racket: 使用布尔值进行折叠

5
(foldr + 0 '(1 2 3 4))

返回10,这正是我所期望的,但是

(foldr and false '(true true false))

给我报错了。
and: expected an open parenthesis before and, but found none

foldr接受一个函数(该函数需要两个参数,因为我有一个列表)、一个基本情况和一个列表。我希望我的第二行代码在列表中有多个布尔值且全部为true时返回true,这就是我认为它应该的工作方式。但显然不是这样。

2个回答

8

And是一个特殊的形式,不能与期望第二个参数为过程foldr一起使用。请尝试使用以下代码:

(foldr (lambda (x y) (and x y)) #t '(#t #t #f)) ;#t as base case

在这种情况下的另一种选择是使用andmap:

(andmap identity '(#t #t #f))

嗯,我正在使用Racket,但那行代码仍然给我报错:“and:问题结果不是真或假:'false”。 - newprogrammer
第二个代码出现了错误:“andmap:期望从identity(给定给andmap的函数)获得布尔值,但收到了'true'”。也许这与我使用的是Racket而不是Scheme有关。 - newprogrammer
1
尝试将所有的 true 替换为 #t,将所有的 false 替换为 #f,看看是否有效。 - Óscar López
1
@newprogrammer:'false#f是两个不同的东西。#t#f是布尔值,用于逻辑运算。在#lang racket中,(and #t #f)(and #f #t)都返回#f,但(and 'true 'false)返回'false,而(and 'false 'true)返回'true - ccoakley
1
对于 or,应该是 #f,而不是像 and 一样是 #t - Will Ness
显示剩余10条评论

0
在Scheme系统中,and通常被定义为宏或特殊形式,而不是过程,这就是为什么它无法工作的原因:
#;1> +
#<procedure C_plus>
#;2> and

Error: unbound variable: and

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接