在Clojure中使用带Filter的多参数谓词



是否可以将filter与具有多个参数的谓词一起使用?如果是这样的话,我将如何在这个代码的上下文中做到这一点:

;predicate
(defn classInstructor [instructor class]
(str/includes? class instructor))
(defn instructorClasses [instructor classList]
(filter classInstructor classList))

map函数可以采用一个应用于多个参数的函数。例如,

=> (map + [1 2 3] [4 5 6])
(5 7 9)

+得到两个参数,每个序列一个。filter没有相应的版本。您可以将标准filter扩展如下:

(defn filter
([f coll]
(clojure.core/filter f coll))
([f coll & colls]
(filter #(apply f %) (apply map vector (cons coll colls)))))

例如,

=> (filter (comp odd? +) [1 2 3] [4 6 8])
([1 4] [3 8])

正如你所看到的,我们必须以某种方式呈现幸存的序列。我觉得这样做没有说服力,也不自然。我认为不值得这样做。

我会这样做,使用一个匿名函数:

(defn classInstructor [instructor class]
(str/includes? class instructor))
(defn instructorClasses [instructor classList]
(filter #(classInstructor instructor %) classList))

这样,当调用instructorClasses时,instructor的值被传递给classInstructor

最新更新