使用字符串检查字符串列表?

Check list for strings using string?

您好,我在测试列表以查看列表是否仅包含字符串时遇到了一些问题。我正在阅读文档 2.3(迭代和递归)+ 3.12(条件),但我似乎无法按照我想要的方式处理列表。

我尽量保持简单,

(define (strings-only? lst)
  [cond
    [(empty? lst) true]
    [else (string?(first lst))
          (string?(rest lst))]])

我假设这样做是首先检查列表 (lst) 看它是否为空。 然后它检查列表的第一个变量看它是否是一个字符串,然后检查其余的。当我输入

(define a (list "This" "that"))

弹出测试错误。我觉得问题在于我尝试使用 first/rest 遍历列表的方式。如有任何想法,我们将不胜感激。

检查您的 else 子句:

[else (string? (first lst))
      (string? (rest lst))]

1) 你有两个谓词调用都 return 一些布尔值,但你没有以任何方式连接它们。您想知道列表中的 所有 元素是否都是字符串,那么什么布尔运算符(andor 等)最适合这里?

2) (string? (rest lst)) 每次都会 return false,因为 rest return 是一个列表,而不是字符串。要真正使它成为递归函数,您需要使用 lst.

rest 再次调用 strings-only?

总结:

(define (strings-only? lst)
  (cond
    [(empty? lst) true]
    [else (___ (string? (first lst))
               (strings-only? (rest lst)))]))

用此处最有意义的布尔运算符填空。

您可以使用内置的 andmap 函数来完成此操作

(define (strings-only? lst)
  (andmap string? lst))