欢迎!请查看关于页面以了解更多有关此信息。
Map, Filter和Reduce在函数式编程中非常常见。所有这些函数的编程语言中,只有Clojure具备在map中添加多个列表的能力。例如-(map + lst1 lst2),这是最有用的功能!
但是,为什么filter不能用同样的方式来实现呢?例如-
(filter (fn [a1 b1] (pos? (+ a1 b1))) [1 2 3] [-2 4 0])
会导致“向clojure.core/filter传递的参数数量不正确(3)”。我假设这一定有原因,但我觉得很难理解。
谢谢!
我不是Clojure团队的一员,但在我看来,这听起来像是一个合理的设计选择。
为此,您还需要提供一个将多个值组合为一个值的函数。有人可能会争论在这个场景中使用vector最有意义,但这并不总是情况。这会增加不必要的复杂性,因为您已经可以这样做
(filter (fn [[a b]] (pos? (+ a b))) (map vector [1 2 3] [-2 4 0]))
但是在这种情况下,keep将非常合适,而且最近有一个关于它的询问。
keep
大多数与过滤器一起使用的 predicter 只需要一个参数,因此通常不需要这样做。