例如, 如果输入是: (清单(清单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)
答案 0 :(得分:2)
你实际上相当接近。以下是一些可能有用的问题:
listoutput
的合同/签名是什么?
append
的合同/签名是什么?
另外,我建议首先简单地构建您的示例,每个示例都基于之前的示例构建。例如,
(check-expect (listoutput empty)) ???)
(check-expect (listoutput (cons (list 1) empty)) ???)
如果第一次测试通过但第二次测试失败,那么在给定函数结构的情况下,这意味着问题在哪里?
答案 1 :(得分:0)
[(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))]))
该行有两个错误。最明显的是它应该是(first mylist)
而不是(first list)
(尽管我希望你实际上知道并错误地输入了它)。第二个是(first mylist)
返回一个列表(因为你得到了一个列表列表),但是在将它传递给append之前你用list
函数包装它。因此,在您的示例中,您第一次调用它时并未将(list 1)
传递给append
,而是(list (list 1))
。您只需从该表达式中删除list
函数。
答案 2 :(得分:0)
你要求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)