你说得对,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)))
(1)可以吗?如果a 是Num 并且b 是(Listof Num),那么(1) 试图在Num 和(Listof Num) 上调用append。这是第一个参数a,这就是问题所在,而不是b。您似乎打算改用 cons。
(2)可以吗?如果b 是(Listof Num),那么(list-ref b 0) 将是Num。所以看起来 (2) 正试图在 Num 和 (Listof Num) 上调用 append。就像 (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)]))