和谓词过滤clojure

时间:2014-10-26 13:36:09

标签: clojure functional-programming

我有一个函数可以接受任意数量的谓词并过滤每个谓词的seq,如下所示:

 (defn andp [& fns]
      (fn [& args]
        (every? #(apply % args) fns)))

(defn pred-and
      ([] "what to return")
      ([x] x)
      ([x y] (andp x y))
      ([x y & more]
          (reduce pred-and (pred-and x y) more)
        )
)

这对于1个或更多这样的参数如此预期有效:

(filter (pred-and pos? odd?) [1 2 -4 0 6 7 -3]) => [1 7] // For one parameter

(filter (pred-and number? integer? pos? even?)             [1 0 -2
:a 7 "a" 2])                   => [2] // For two parameters

问题是当我没有传递参数时,它应该返回原始序列怎么做?

(filter (pred-and) [1 0 -2]) => [1 0 -2]

1 个答案:

答案 0 :(得分:1)

根据docs过滤器

  

返回coll中项目的延迟序列,其中(pred item)返回true。

要获得原始序列,(pred item)必须为每个项目返回true。

(fn [x] true)应该可以解决问题。