Как переназначить переменную в функции в Racket? - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу инициализировать cc как 0. Я хочу добавить длину каждого элемента lst. Я понимаю, что это не самый простой способ сделать это, но я упростил свой реальный код для этого примера. Как именно я могу накапливать общую длину и присваивать ей cc.

Также я стараюсь избегать использования set! или другой ! команды.

(define (total-length-list lst)
  (define acc 0)
    (for/list ([i lst])
      (cond [(= 0 (length i)) (+ acc 0)]
            [(= 1 (length i)) (+ acc 1)]
            [(= 2 (length i)) (+ acc 2)]))
  acc)

1 Ответ

0 голосов
/ 17 февраля 2020

Из вашего описания я бы реализовал это с 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! обязательно.

...