您好我在测试列表时遇到一些麻烦,看看列表是否只包含字符串。我正在阅读文档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"))
它弹回来说测试是错误的。我觉得问题在于我试图通过第一次/休息迭代列表。任何想法都将不胜感激。
答案 0 :(得分:3)
检查您的else
条款:
[else (string? (first lst))
(string? (rest lst))]
1)你有两个谓词调用,它们都返回一些布尔值,但你不能以任何方式连接它们。你想知道列表中的所有元素是否是字符串,那么布尔运算符(and
,or
等)最适合这里?
2)(string? (rest lst))
每次都会返回false,因为rest
返回一个列表,而不是一个字符串。要真正使其成为递归函数,您需要使用strings-only?
的{{1}}再次调用rest
。
总结:
lst
使用在这里最有意义的布尔运算符填充空白。
答案 1 :(得分:2)
您可以使用内置的andmap功能来完成此操作
(define (strings-only? lst)
(andmap string? lst))