Clojure 2024状态调查中分享您的想法!

欢迎!请参阅《关于》页面以获取更多有关如何使用本站的信息。

0

Map、Filter和Reduce在函数式编程中非常常见。
在所有具有这些函数的语言中,只有Clojure具有在map中添加多个列表的能力。例如:(map + lst1 lst2),这非常有用!

但是为什么不能用Filter进行相同的操作?例如-

(filter (fn [a1 b1] (pos? (+ a1 b1))) [1 2 3] [-2 4 0]) 

将会导致 "Wrong number of args(3) passed to clojure.core/filter"(传递给 clojure.core/filter 的参数数量错误)。
我认为这肯定有原因,但不明白为什么这会成为常见的做法。

谢谢!

2 个答案

0

我不是Clojure团队成员,但在我看来这是一个合理的设计选择。

为了使之生效,您还必须提供一个用于将多个值合并为一个值的函数。有人可能会说向量在这里最有意义,但这并不总是如此。这会增加不必要的复杂性,而您已经可以通过下面的方式完成它

(filter (fn [[a b]] (pos? (+ a b)))
        (map vector [1 2 3] [-2 4 0]))

但在这种情况下,keep会是一个非常合适的选项 - 关于这一点有一个最近的提问

0

大多数与过滤器一起使用的预测器都只需要一个参数,所以这通常是不需要的。

...