消除Scheme中列表中的空列表

时间:2016-05-05 19:55:16

标签: list scheme

我有一个列表,其中列出了一些列表,其中一些列表为空。我的功能是通过主列表并检查是否有空列表。如果为空,则消除它们(或应该)。我一直在买车:合同违规错误告诉我它期待一对但是得到一个'()。我不知道如何更改它以避免出现此错误。

       (define (take-out-nulls alist)
        (cond ((null? (car alist)) (take-out-nulls (cdr alist)))
         (#t (cons (car alist)(take-out-nulls (cdr alist))))))

2 个答案:

答案 0 :(得分:3)

你有一个没有终止测试的递归,即使在最后,你的函数继续要求car alist

只需将此类测试添加到该功能中:

(define (take-out-nulls alist)
  (cond ((null? alist) '())
        ((null? (car alist)) (take-out-nulls (cdr alist)))
        (#t (cons (car alist) (take-out-nulls (cdr alist))))))

(take-out-nulls '(a () () b c ()))  ; => (a b c)

答案 1 :(得分:0)

您也可以使用

(define (take-out-nulls alist)
  (filter (λ (x) (not (empty? x))) alist))

(take-out-nulls '(a () () b c ())) ;=> (a b c)