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

Scheme lambda映射期间跳过或继续方案,scheme,racket,Scheme,Racket,我正在构建一个函数,它接受一组整数,并返回奇数整数的子集。我遇到了一个问题,需要跳过映射中的偶数整数,但现在我的函数返回的是 (define (oddSubset set) (map (lambda (x) (cond ((odd? x) x))) s)) (cond ((odd? x) x)) 使用中: > (oddSubset '(1 2 3)) '(1 #<void> 3) >(oddSubset

我正在构建一个函数,它接受一组整数,并返回奇数整数的子集。我遇到了一个问题,需要跳过映射中的偶数整数,但现在我的函数返回的是

 (define (oddSubset set)
   (map
     (lambda (x)
       (cond 
         ((odd? x) x)))
     s))
(cond 
   ((odd? x) x))
使用中:

> (oddSubset '(1 2 3))
'(1 #<void> 3)
>(oddSubset'(1 2 3))
'(1 # 3)
我是否可以使用像“否则,继续下一个元素”这样的逻辑


注意:我正在尝试重写内置的过滤器函数

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

filter
是您需要的

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

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

filter
是您需要的

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

map
不能跳过,但您可以使用
filter

(filter odd? '(1 2 3 4 5 6)) ; ==> (1 3 5)
或者您可以使用
向右折叠

(fold-right (lambda (e acc)
              (if (odd? e)
                  (cons e acc)
                  acc))
            '()
            '(1 2 3 4 5 6)) ; ==> (1 3 5)
我猜是
#!r6rs
向右折叠
过滤器
都在库中
(rnrs列表(6))
。还有一个例子给出了R5RS语言的这两个过程


使用非标准语言
#!球拍
使用名称
foldr
代替
右折

地图
不能跳过,但您可以使用
过滤器

(filter odd? '(1 2 3 4 5 6)) ; ==> (1 3 5)
或者您可以使用
向右折叠

(fold-right (lambda (e acc)
              (if (odd? e)
                  (cons e acc)
                  acc))
            '()
            '(1 2 3 4 5 6)) ; ==> (1 3 5)
我猜是
#!r6rs
向右折叠
过滤器
都在库中
(rnrs列表(6))
。还有一个例子给出了R5RS语言的这两个过程


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

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

map
在所有元素上应用函数。函数的每次调用都应该独立于其他调用。即使引入带有闭包的状态,也无法避免
map
构建与输入大小相同的列表。
 (define (oddSubset set)
   (map
     (lambda (x)
       (cond 
         ((odd? x) x)))
     s))
(cond 
   ((odd? x) x))
您希望(重新)实现该功能。如果你想自己做,你应该试着使用
foldl
foldr

 (define (oddSubset set)
   (map
     (lambda (x)
       (cond 
         ((odd? x) x)))
     s))
(cond 
   ((odd? x) x))
map
检查列表中的每个元素:如果是奇数,则返回该元素。但是当元素不是奇数时,您没有告诉程序该怎么做,因此
map
return
void

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

如果您想知道如何实现
过滤器
,请阅读本教程的第二章

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

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


如果您想知道如何实现
过滤器
,请尝试阅读

的第二章,我正试图为此重写内置过滤器。请查看下面的答案所示的折叠。如果您想自己编写所有内容,请编写一个简单的函数,在满足条件的情况下向结果添加(car输入),然后在(cdr输入)上递归。任何讨论lisp的教程都应该有一个简单的例子,你可以遵循。我正试图为此重写内置的过滤器。看看下面的答案所示的折叠。如果您想自己编写所有内容,请编写一个简单的函数,在满足条件的情况下向结果添加(car输入),然后在(cdr输入)上递归。任何讨论lisp的教程都应该有一个简单的示例,您可以遵循。