Из вашего описания я бы реализовал это с apply
и map
.
;; total-length-list : [Listof [Listof Any]] -> Natural
(define (total-length-list lst)
(apply + (map length lst)))
Если вы хотите использовать al oop, тогда for/sum
- это хорошо.
;; total-length-list : [Listof [Listof Any]] -> Natural
(define (total-length-list lst)
(for/sum ([i lst])
(length i)))
Если вы хотите использовать аккумулятор, for/fold
может сделать это.
;; total-length-list : [Listof [Listof Any]] -> Natural
(define (total-length-list lst)
(for/fold ([acc 0]) ([i lst])
(+ acc (length i))))
И если вам все еще нужно это cond
по какой-то причине, вы можете поместить его в for/fold
, но убедитесь, что у вас есть случай else
, который возвращает аккумулятор без изменений.
;; total-length-list : [Listof [Listof Any]] -> Natural
(define (total-length-list lst)
(for/fold ([acc 0]) ([i lst])
(cond [(= 0 (length i)) (+ acc 0)]
[(= 1 (length i)) (+ acc 1)]
[(= 2 (length i)) (+ acc 2)]
[else acc])))
Если вы пропустите [else acc]
в условии, вы можете получить ошибку о #<void>
.
Но проще, тем лучше, поэтому я бы рекомендовал либо использовать apply
с map
, либо использовать for/sum
, без накопителей или условных обозначений.
С точки зрения императора-программиста ,
(for/fold ([acc init]) ([elem lst])
body)
возвращает то же значение, что и
(define acc init)
(for ([elem lst])
(set! acc body))
acc
Однако for/fold
делает это без каких-либо мутаций / set!
обязательно.