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