我正在构建一个带有一组整数的函数,并返回奇数整数的子集。我遇到了我需要跳过地图中偶数整数的问题,但现在我的函数返回#<void>
。
(define (oddSubset set)
(map
(lambda (x)
(cond
((odd? x) x)))
s))
使用中:
> (oddSubset '(1 2 3))
'(1 #<void> 3)
我可以使用的逻辑如“else,继续下一个元素”吗?
注意:我正在尝试重写内置过滤器功能
答案 0 :(得分:2)
map
看起来像是一个奇怪的选择。根据定义,它将一个函数映射到列表中的每个元素并返回结果列表,因此尝试跳过&#34;跳过&#34;元素似乎不自然。
filter
是您正在寻找的。 p>
(filter odd? '(1 2 3))
'(1 3)
答案 1 :(得分:2)
map
无法跳过,但您可以改为使用filter
:
(filter odd? '(1 2 3 4 5 6)) ; ==> (1 3 5)
或者您可以使用fold-right
(fold-right (lambda (e acc)
(if (odd? e)
(cons e acc)
acc))
'()
'(1 2 3 4 5 6)) ; ==> (1 3 5)
我假设#!r6rs
。 fold-right
和filter
都在库(rnrs lists (6))
中。还有SRFI-1为R5RS语言提供了这两个程序。
使用非标准语言#!racket
使用名称foldr
代替fold-right
。
答案 2 :(得分:1)
map
对所有元素应用函数。每次调用函数都应该与其他函数无关。即使您引入了一个带闭包的状态,也无法避免map
构建与输入相同大小的列表。
您想(重新)实现filter
功能。如果你想自己做,你应该尝试使用foldl
和foldr
。
答案 3 :(得分:0)
(cond
((odd? x) x))
map
检查列表中的每个元素:如果是奇数,则返回该元素。但是当元素不奇怪时,你没有告诉程序该做什么,所以map
返回void
。
要解决您的问题:请改用filter
,因为map
会为列表中的每个元素返回一些内容。
如果您想知道如何实施filter
,请尝试阅读SICP的第二章