如何从此列表中过滤空值?

How can I filter null values from this list?

我有以下创建列表中所有素数对的过程:

(define (prime-pairs lst)
  (define (split lst pos)
    (list (drop-right lst pos) (take-right lst pos)))
  (define (prime-pairs-iter n acc)
    (cond ((= n 0) (filter (lambda (e) (not (null? e))) acc))
          (else (prime-pairs-iter (- n 1) 
                                  (let ((s (split lst n)))
                                    (if (and (prime? (list->number (car s)))
                                             (prime? (list->number (cadr s))))
                                        (append s acc)
                                        acc))))))
  (prime-pairs-iter (- (length lst) 1) '()))

(完整代码:https://gist.github.com/anonymous/b8cfcb0bf021be9ef9c8

我想要 prime-pairs 做的是创建一个包含 lst 中由两个素数组成的每一对的列表。这些数字以如下列表格式表示:11 将是 '(1 1).

不幸的是,当我 运行 这段代码时 (filter (lambda (e) (not (null? e))) acc)) 似乎没有从最终结果中删除 '(),我最终得到一长串空值和想要的对。

如果我使用 (filter null? acc)),则会保留一个空值列表。所以反过来(过滤掉实际值)确实有效。

如何过滤掉返回列表中的空值?

目前,您的 prime-pairs 函数总是 return 一个值:空列表或素数对。使用 map,如果不对 map.

的结果进行进一步过滤,就无法避免出现空列表

一种替代方法是 return 列表 结果,并使用 append-map 而不是 map。将您的 prime-pairs 更改为 return 空列表,或 包含素数对的单例列表 ;这模拟 returning 零或一个值,而不是总是一个值。像这样:

(cond ((zero? n) (if (null? acc)
                     '()
                     (list acc)))
      ...)

现在,使用 append-map:

(append-map prime-pairs primes-list-split)

你应该得到你想要的结果。 (有关完整代码,请参阅 my forked gist。)