如何在clojure中使用谓词?

时间:2014-09-04 17:31:45

标签: clojure

我对clojure有点新,我不确定如何使用谓词。例如,如何创建一个函数来返回满足谓词的列表中的元素。

>(filter-in number? '(a 2 (1 3) b 7))
 (2 7)

 >filter in symbol? '(a (b c) 17 foo))
 (a foo)

我尝试了这个,但它不起作用:

(defn filter-in [pred lst]
   (fn [x]
     (if (empty? lst)
       ()
       (if (pred (first lst))
         (cons (first lst) (filter-in pred (rest lst)))
         (filter-in pred (rest lst))))))

提前致谢。

1 个答案:

答案 0 :(得分:1)

正如@Deigo_Basch在评论中指出的那样,Clojure已经有了一个内置函数“过滤器”,可以满足您的需求。

但是,如果您正在尝试创建自己的应用以帮助您的学习过程,那么您的解决方案几乎就在那里:

(defn filter-in [pred lst]
     (if (empty? lst)
       '()
       (if (pred (first lst))
         (cons (first lst) (filter-in pred (rest lst)))
         (filter-in pred (rest lst)))))

您的原始解决方案实际上是定义了一个返回另一个函数的函数('fn [x]'部分)。返回其他函数的高级函数通常很有用,但在这种情况下,您正在寻找直接对其参数执行的函数。

另请注意,与Clojure的内置过滤器不同,您的定义并不是懒惰的。它也没有使用Clojure的循环复现机制,因此可能会在大型列表中炸毁堆栈。这些是Clojure的功能,当您了解更多信息时,您很快就会遇到这些功能。