Как вы возвращаете все элементы в списке списков?(Схема PLT) - PullRequest
1 голос
/ 29 октября 2011

Например, если ввод: (список (список 1) (список 2) (список 3)), вывод будет: (список 1 2 3)

Почему этот код не работает?

(define (listoutput mylist)
  (cond
    [(empty? mylist) empty]
    [(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))]))

(check-expect (listoutput (list (list 1) (list 2) (list 3)))
              (list 1 2 3)

Ответы [ 3 ]

2 голосов
/ 29 октября 2011

Вы на самом деле довольно близко.Вот некоторые вопросы, которые могут помочь:

Что такое контракт / подпись listoutput?

Что такое контракт / подпись append?

Также я рекомендуюсначала создайте свои примеры, каждый пример опираясь на предыдущие.Например,

(check-expect (listoutput empty)) ???)
(check-expect (listoutput (cons (list 1) empty)) ???)

Если первый тест пройден, но второй не пройден, что это означает о том, где проблема, учитывая структуру функции?

0 голосов
/ 29 октября 2011

Вы запрашиваете процедуру flatten, попробуйте это:

(define (flatten lst)
  (cond ((empty? lst) null)
        ((not (list? lst)) (list lst))
        (else (append (flatten (first lst))
                      (flatten (rest lst))))))

Вы можете проверить это:

(flatten  (list (list 1) (list 2) (list 3)))
> (1 2 3)
(flatten '(1 (2 (3)) (4)))
> (1 2 3 4)
0 голосов
/ 29 октября 2011
[(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))]))

В этой строке две ошибки.Наиболее очевидным является то, что это должно быть (first mylist), а не (first list) (хотя я ожидаю, что вы действительно это знаете и опечатали).Во-вторых, (first mylist) возвращает список (поскольку вы получаете список списков), но затем вы оборачиваете его с помощью функции list перед передачей для добавления.В результате в вашем примере вы не передаете (list 1) на append при первом вызове, а скорее (list (list 1)).Вы должны просто удалить функцию list из этого выражения.

...