Scheme 如何筛选方案中列表中的列表?

Scheme 如何筛选方案中列表中的列表?,scheme,racket,Scheme,Racket,我在从列表中筛选列表时遇到问题 给定一个列表列表,我希望它返回一个在第三个元素中包含某个单词的列表 例如:如果我想找到包含单词dog的子列表 例如:”(“本”2“狗”)(“凯丝”1“猫”)(“马特”6“狗”) 应该返回”(“Ben”2“dog”)(“Matt”6“dog”) 这是我试图做的,但不幸的是,它给了我一个错误 (define (dog-only lst) (cond [(empty? lst) null ] [else (filter (map (equal? (car (cdd

我在从列表中筛选列表时遇到问题

给定一个列表列表,我希望它返回一个在第三个元素中包含某个单词的列表

例如:如果我想找到包含单词dog的子列表

例如:
”(“本”2“狗”)(“凯丝”1“猫”)(“马特”6“狗”)

应该返回
”(“Ben”2“dog”)(“Matt”6“dog”)

这是我试图做的,但不幸的是,它给了我一个错误

(define (dog-only lst)
 (cond [(empty? lst) null ]
 [else (filter
 (map (equal? (car (cddr lst)) "dog")))] 
))

这里不需要使用
map
,这不是使用
filter
的正确方法,需要将
lambda
作为参数传递。另外,当
lst
为空时,您不需要单独的条件来处理该情况。试试这个:

(define lst '(("Ben" 2 "dog") ("Kath" 1 "cat") ("Matt" 6 "dog")))
(filter (lambda (e) (equal? (caddr e) "dog")) lst)
=> '(("Ben" 2 "dog") ("Matt" 6 "dog"))

map
接受函数,而不是表达式

(define test '(("Ben" 2 "dog") ("Kath" 1 "cat") ("Matt" 6 "dog")))

(define (dog? e)
  (and (pair? e)
       (>= 3 (length e))
       (equal? (caddr e) "dog")))

(dog? (car test))  ; ==> #t
(dog? (cadr test)) ; ==> #f

(define (dogs animals)
  (filter dog? animals))

(dogs test) 
; ==> (("Ben" 2 "dog") ("Matt" 6 "dog"))