我对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))))))
提前致谢。
答案 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的功能,当您了解更多信息时,您很快就会遇到这些功能。