Racket 过滤器和过滤器映射之间有什么不同?

Racket 过滤器和过滤器映射之间有什么不同?,racket,Racket,我在试着理解你要做什么 我已经阅读了文件,上面写着: 返回(长度(筛选器映射过程lst…),但不生成 中间名单 然后,我阅读了文档,它说: 返回(筛选器(lambda(x)x)(映射过程lst…),但不带 构建中间列表 然后,我阅读了文档,并且理解了它 但是,我不明白。特别是(lambda(x)x)中的(lambda(x)x)(映射过程lst…) 过滤器和过滤器映射之间有什么不同 顺便说一句,filter和filter-map的例子也一样,这使得理解它们更加困难。关键是,如果你对filter和m

我在试着理解你要做什么

我已经阅读了文件,上面写着:

返回(长度(筛选器映射过程lst…),但不生成 中间名单

然后,我阅读了文档,它说:

返回(筛选器(lambda(x)x)(映射过程lst…),但不带 构建中间列表

然后,我阅读了文档,并且理解了它

但是,我不明白。特别是
(lambda(x)x)
中的
(lambda(x)x)(映射过程lst…)

过滤器
过滤器映射
之间有什么不同


顺便说一句,
filter
filter-map
的例子也一样,这使得理解它们更加困难。

关键是,如果你对
filter
map
了解得很好,那么你就可以这样解释
filter-map
。如果您不知道
过滤器
映射
做了什么,这将无助于您理解它。当你需要学习新的东西时,你通常需要利用以前的经验。我可以这样解释乘法:
3*4
3+3+3
是一样的,但如果你不知道
+
是什么,那就没用了

过滤器
过滤器映射

(过滤奇数?'(1 2 3 4 5));=>(1 3 5)
(过滤映射奇数?'(12345));=>(#t#t#t))
当谓词变为truthy时,第一个从列表中收集原始值。在这种情况下,
(奇数?1)
为真,因此
1
是结果中的一个元素

filter map
不会在
odd?
上进行过滤,它的工作方式就像将
odd?
传递到
map
一样。在这里,您将得到一个包含结果的新列表

(映射奇数?'(12345));=>(#t#f#t#f#t#f)
然后删除假值,以便只剩下真值:

(筛选器标识(映射奇数?)(1 2 3 4 5));=>(#t#t#t)
现在。重要的是要理解,在Scheme中,除了
#f
之外的所有值都是真的。
(lambda(x)x)
是身份功能,与
中的
身份
相同。它返回自己的参数

(过滤器标识(1#f2#f3));=>(1 2 3)
count
的工作方式与
filter map
相同,只是它只返回您将获得的元素数。因此:

(奇数计数?'(12345));=>3.
现在它提到它与:

(长度(过滤器标识(映射奇数?)(1 2 3 4 5)))
由于代码使用
map
filter
length
等创建了两个列表,因此执行此操作。因此,当count执行相同操作时,它不使用
map
filter
。现在看来这是一个原语,但您可以这样做:

(定义(计数fn lst)
(let循环((lst lst)(cnt 0))
(cond((null?lst)cnt)
((fn(车辆lst))(环路(cdr lst)(add1 cnt)))
(其他(循环(cdr lst)cnt)))

我想说,这里的关键观点是,在
过滤器的上下文中,您应该将
(lambda(x)x)
读为
非假?
。因此,过滤器映射的文档可以写成:


返回
(filter not false?(map proc lst…)
,但不构建中间列表,其中
not false?
可以定义为
(lambda(x)x)

后续:现在建议更改文档以澄清此问题。感谢@VansFannel的提示!欢迎您。我很高兴成为社区的一员。
(过滤器映射(λ(x)(如果(偶数?x)(列表x)#f))'(1 2 3 4 5))
==>
”((2)(4 4))