Scheme 查找列表中的元素是否为整数?

Scheme 查找列表中的元素是否为整数?,scheme,Scheme,我想知道,如何检查列表中的每个元素是否都是整数?我可以使用(integer?(car list)检查第一个元素,但是如果我使用(integer?(cdr list),它总是返回false(#f),因为列表的最后一部分不是一个整数作为一个组。 在这种情况下,让我们假设列表定义为。 (定义列表’(1 2 5 4 5 3))实用方案提供了跨整个序列进行测试的功能。例如,该功能的应用程序将是合适的。Racket提供了执行类似操作的方法。如果您确实需要手动写出循环,则将使用递归。您需要做的是测试列表中的每

我想知道,如何检查列表中的每个元素是否都是整数?我可以使用(integer?(car list)检查第一个元素,但是如果我使用(integer?(cdr list),它总是返回false(#f),因为列表的最后一部分不是一个整数作为一个组。 在这种情况下,让我们假设列表定义为。
(定义列表’(1 2 5 4 5 3))

实用方案提供了跨整个序列进行测试的功能。例如,该功能的应用程序将是合适的。Racket提供了执行类似操作的方法。如果您确实需要手动写出循环,则将使用递归。

您需要做的是测试列表中的每个元素,看看它是否正确满足一个条件(在本例中为整数)。当您对整数列表计算
(integer?(car list))
时,您正在检查列表中的第一个元素是否为整数,这很好。但是表达式
(integer?(cdr list))
测试列表是否为整数(因为
cdr
返回一个列表),这将不起作用-您需要测试列表中的下一个元素,然后测试下一个元素,以此类推,直到列表为空

有几种方法可以执行上述操作,最简单的方法是在列表上重复依次测试每个元素,如果找到非整数元素,则返回
false
,如果使用所有列表而未找到非整数元素,则返回
true
,如下所示:

(define (all-integers? lst)
  (cond ((null? lst) #t)
        ((not (integer? (car lst))) #f)
        (else (all-integers? (cdr lst)))))
(andmap integer? lst)
更实用的方法是使用内置程序,如下所示:

(define (all-integers? lst)
  (cond ((null? lst) #t)
        ((not (integer? (car lst))) #f)
        (else (all-integers? (cdr lst)))))
(andmap integer? lst)
将检查给定谓词的
lst
中的所有元素是否计算为
true
。例如:

(andmap integer? '(1 2 3))
> #t

(andmap integer? '(1 "x" 3))
> #f

SRFI-1使用术语
every
any
,而不是
,也可以使用MAP
ormap
match

(define list-of-integers?
  (lambda (lst)
    (match lst
           (((? number?) ..1) #t)
           (_ #f))))

返回字符串而不是布尔值?使用嵌套的
if
s而不是
cond
?此解决方案不太惯用。为了清晰起见,这是为了显示此方法背后的逻辑。