Как исправить нарушение договора для списков списков в рэкет? - PullRequest
0 голосов
/ 03 октября 2019

Я изучаю Ракетки для понимания принципов языков программирования. Что я делаю, так это добавляю только вторые элементы в пары списка. В моем понимании, я думаю, что я делаю правильно. Однако появляется сообщение об ошибке. Пожалуйста, дайте мне любой совет, чтобы понять, что я делаю неправильно.

(define pairs
 '((1 5)(6 4)(7 8)(15 10)))
(define (secondSum lst)
  (if (null? lst) 0
      (+ (cdr (car lst)) (secondSum (cdr lst)))
      )
  )
>(secondSum pairs)
+: contract violation
  expected: number?
  given: '()
  argument position: 2nd
  other arguments...:
   10

Я ищу

(5 + 4 + 8 + 10)

1 Ответ

0 голосов
/ 03 октября 2019

(cdr (car lst)) должно быть (car (cdr (car lst))) также (cadr (car lst)) или в ракетке предпочтительнее (second (first lst)), то есть если lst равно '((1 5)) результат должен быть 5.

Я должен был бытьЯ понял, что это правильно, поэтому я запустил программу с исправлением и проверил результат:

(define pairs '((1 5)(6 4)(7 8)(15 10)))

(define (secondSum lst)
  (if (null? lst) 0
      (+ (car (cdr (car lst))) (secondSum (cdr lst)))
      )
  )

(secondSum pairs)

(+ 5 4 8 10)

Последние два выражения имеют значение 27.

...