如何从此列表中过滤空值?
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。)
我有以下创建列表中所有素数对的过程:
(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。)