Вы правы, что b
здесь список.Но как насчет других аргументов append
, таких как a
или (list-ref b 0)
?
Об этих вещах легче думать, если вы ставите подписи на своих функциях, чтобы показать, что они принимают в качестве аргументов и что они возвращают.Вы сказали, что bubble
принимает (Listof Num) и возвращает список после 1 прохода пузырьковой сортировки.Почему бы не записать это в коде?
;; bubble : (Listof Num) -> (Listof Num)
;; returns the list after 1 pass of bubble sort
(define (bubble L)
...)
Вы должны сделать то же самое для своей вспомогательной функции, check-numbers-size
.Вы сказали, что b
- это список:
;; check-numbers-size : ??? (Listof Num) -> ???
И поскольку вы используете (cons a b)
в теле, я предполагаю, что вы хотели, чтобы a
был Num
, чтобы функциявозвращает (Listof Num)
.
;; check-numbers-size : Num (Listof Num) -> (Listof Num)
(define (check-numbers-size a b)
...)
Теперь, когда мы знаем, что a
является Num
, а b
является (Listof Num)
, мы можем выяснить, каковы аргументы append
,Причиной проблемы могут быть два append
вызова:
(append a (rest b))
(append (list-ref b 0) (append a (rest b)))
Is (1)Хорошо?Если a
- это Num
, а b
- это (Listof Num)
, то (1) пытается вызвать append
для Num
и (Listof Num)
.Это первый аргумент, a
, это проблема, а не b
.Похоже, вы хотели использовать cons
вместо.
С (2) все в порядке?Если b
является (Listof Num)
, тогда (list-ref b 0)
будет Num
.Таким образом, похоже (2) пытается вызвать append
на Num
и (Listof Num)
.Как и (1), это первый аргумент, который является проблемой.И опять же, похоже, что вы намеревались использовать cons
.
Функция cons
имеет сигнатуру X (Listof X) -> (Listof X)
, где X
может быть любого типа, например Num
.Если вы используете cons
вместо append
всякий раз, когда хотите добавить одиночное число в список, ваш код делает то, что вы ожидаете:
;; check-numbers-size : Num (Listof Num) -> (Listof Num)
(define (check-numbers-size a b)
(cond
[(empty? b) (cons a b)]
[(> a (list-ref b 0)) (cons (list-ref b 0) (cons a (rest b)))]
[else (cons a b)]))