在Clojure中使用带过滤器的多参数谓词

时间:2018-11-18 00:05:41

标签: clojure

是否可以对带有多个参数的谓词使用过滤器?如果是这样,我将如何在此代码的上下文中做到这一点:

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

2 个答案:

答案 0 :(得分:0)

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])

如您所见,我们必须以某种方式呈现尚存的序列。我认为这样做并不是有说服力的或自然的。我认为这不值得做。

答案 1 :(得分:0)

我将使用匿名函数这样做:

(defn classInstructor [instructor class]
  (str/includes? class instructor))

(defn instructorClasses [instructor classList]
  (filter #(classInstructor instructor %) classList))

这样,当一个人呼叫instructorClasses时,instructor的值将传递到classInstructor