Как сложить список схем ракетки - PullRequest
1 голос
/ 28 марта 2019

Новое в Racket Scheme и попытка сложить содержимое определенного списка. Я должен сложить список по отдельности, например, итоги каждого отдельного списка, а затем итоги всего списка вместе.

Пока что у меня есть определенный список и то, что я считаю начальным сложением итогов списка, но кажется, что ничего не суммируется вместе. Как я могу сложить все значения в этом списке и весь список по отдельности?

КОД

#lang racket
(define team '(("Emp1" (57 57 80 47 68 56 84 65))
               ("Emp2" (57 69 57 84 87 71 77 69 61 48))
               ("Emp3" (46 47 61 65 81 64 40 77 51 78))
               ("Emp4" (70 68 89 41))
               ("Emp5" (45 48 74 83 40 44 70 85 98 86))
               ))

(define (getEmpTotals team)
  (if (empty? team) 0
      (+ (first team)(getEmpTotals(rest team)))))

Функция для реализации

(getTeamTotal team)

Желаемый выход

(("Emp1" 514) ("Emp2" 680) ("Emp3" 610) ("Emp4" 268) ("Emp5" 673))

2745

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Ваш (first team) извлекает список ("Emp1" (57 57 80 47 68 56 84 65)), который вы не можете использовать + вкл.

#lang racket

(require rackunit)

;; A Team is a [Listof [list String [Listof Number]]]
;; or
;; A Team is a [Listof Emp]
;; An Emp is a [list String [Listof Number]]

(define team '(("Emp1" (57 57 80 47 68 56 84 65))
               ("Emp2" (57 69 57 84 87 71 77 69 61 48))
               ("Emp3" (46 47 61 65 81 64 40 77 51 78))
               ("Emp4" (70 68 89 41))
               ("Emp5" (45 48 74 83 40 44 70 85 98 86))))

;; [Listof Number] -> Number
;; sums every number in l
(define (lsum l)
  (apply + l))

;; a recursive version, if you want:
(define (lsum-rec l)
  (if (empty? l)
      0
      (+ (first l) (lsum-rec (rest l)))))


;; you can map lsum on the [Listof Number] part of the team
(define (emp-sum team)
  (map (λ (empl) (list (first empl) (lsum (second empl)))) team))

(check-equal? (emp-sum team)
              '(("Emp1" 514) ("Emp2" 680) ("Emp3" 610) ("Emp4" 268) ("Emp5" 673)))

(define (team-sum team)
  (lsum (map second (emp-sum team))))

(check-equal? (team-sum team)
              2745)
2 голосов
/ 28 марта 2019

Проблема заключается в этой части:

(first team)

Первая команда - это список из двух элементов, идентификатора и подсписка, и мы хотим добавить все элементы вэтот подсписок.Вот как:

(define (getEmpTotals team)
  (if (empty? team)
      0
      (+ (apply + (first (rest (first team))))
         (getEmpTotals (rest team)))))

Часть (first (rest (first team))) можно упростить до (cadar team)(apply + ...) добавляет все элементы в подсписок.

В качестве другой альтернативы мы можем использовать процедуры более высокого порядка для написания более идиоматического решения:

(define (getEmpTotals team)
  (foldl (λ (t acc) (+ (apply + (cadr t)) acc))
         0
         team))

В любом случае,работает как положено:

(getEmpTotals team)
=> 2745
...