Рассмотрим, что означает x
в аргументе filter
. Это элемент lst
, что означает либо '(joe 21 "employed")
, '(ann 19 "unemployed")
, либо '(sue 18 "employed")
.
Ни один из этих элементов не равен item
, равному "employed"
. Таким образом, вместо проверки равенства со всем элементом, вы должны проверить равенство со статусом элемента. Примерно так:
;; Example: (get-status '(joe 21 "employed")) = "employed"
(define (get-status x) (third x))
Тогда предикат для фильтрации должен проверить, равен ли статус элементу:
(lambda (x) (equal? (get-status x) item))
Обратите внимание, как он использует get-status
и как он это делает не используйте not
при равенстве.
После фильтрации с этим предикатом вы можете использовать length
вместо map length
.
;; Example: (get-status '(joe 21 "employed")) = "employed"
(define (get-status x) (third x))
(define (countStatus lst item)
(length (filter (lambda (x) (equal? (get-status x) item)) lst)))
(define lst '((joe 21 "employed") (ann 19 "unemployed") (sue 18 "employed")))
Под этимиопределения, вы получите 2
, как вы хотели:
> (countStatus lst "employed")
2