2015-10-18 19 views
0

我正在构建一个接受一组整数的函数,并返回奇数整数的子集。我遇到了问题,我需要跳过映射中的整数,但现在我的函数返回#<void>计划在lambda图中跳过或继续

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

在使用中:

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

是否有逻辑,我可以使用像 “否则,继续到下一个元素”?

注:我想重写内置的过滤器功能

回答

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

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

filter是你在找什么。

(filter odd? '(1 2 3)) 
'(1 3) 
+0

我想重写内置的过滤器这一第二章。 –

+0

看看我的下面答案所示的折叠。如果你想自己写所有的东西,写一个简单的函数,如果它满足条件,然后递归(cdr输入),就会将(汽车输入)添加到结果中。任何讨论lisp的教程应该有一个简单的例子,你可以遵循。 – 2015-10-19 00:06:58

1

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

0
(cond 
    ((odd? x) x)) 

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

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

如果你想知道如何实现filter,尝试阅读的SICP