方案在lambda映射期间跳过或继续

时间:2015-10-18 19:57:36

标签: scheme racket

我正在构建一个带有一组整数的函数,并返回奇数整数的子集。我遇到了我需要跳过地图中偶数整数的问题,但现在我的函数返回#<void>

 (define (oddSubset set)
   (map
     (lambda (x)
       (cond 
         ((odd? x) x)))
     s))

使用中:

> (oddSubset '(1 2 3))
'(1 #<void> 3)

我可以使用的逻辑如“else,继续下一个元素”吗?

注意:我正在尝试重写内置过滤器功能

4 个答案:

答案 0 :(得分:2)

map看起来像是一个奇怪的选择。根据定义,它将一个函数映射到列表中的每个元素并返回结果列表,因此尝试跳过&#34;跳过&#34;元素似乎不自然。

filter是您正在寻找的。

(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)

我假设#!r6rsfold-rightfilter都在库(rnrs lists (6))中。还有SRFI-1为R5RS语言提供了这两个程序。

使用非标准语言#!racket使用名称foldr代替fold-right

答案 2 :(得分:1)

map对所有元素应用函数。每次调用函数都应该与其他函数无关。即使您引入了一个带闭包的状态,也无法避免map构建与输入相同大小的列表。 您想(重新)实现filter功能。如果你想自己做,你应该尝试使用foldlfoldr

答案 3 :(得分:0)

(cond 
   ((odd? x) x))

map检查列表中的每个元素:如果是奇数,则返回该元素。但是当元素不奇怪时,你没有告诉程序该做什么,所以map返回void

要解决您的问题:请改用filter,因为map会为列表中的每个元素返回一些内容。

如果您想知道如何实施filter,请尝试阅读SICP的第二章

相关问题