Clojure 为同一集合组合函数
我刚开始学习Clojure 为同一集合组合函数,clojure,Clojure,我刚开始学习Clojure,我开始使用其他函数式语言,创建一些具有以下函数的管道 val result = filter(something) map(something) reduce(something) collection 我正试图通过Clojure结合两个过滤器函数来实现类似的功能 (defn filter-1 [array] (filter (fn [word]
Clojure
,我开始使用其他函数式语言,创建一些具有以下函数的管道
val result = filter(something)
map(something)
reduce(something)
collection
我正试图通过Clojure结合两个过滤器函数来实现类似的功能
(defn filter-1 [array] (filter
(fn [word] (or (= word "politrons") (= word "hello"))) array))
(defn filter-2 [array] (filter
(fn [word] (= word "politrons")) array))
(def result (filter-1 ["hello" "politrons" "welcome" "to" "functional" "lisp" ""]))
(println "First:" result)
(println "Pipeline:" ((filter-2 result)))
但我无法让它工作
您能否提供一些建议或文档,说明如何为同一个集合
组合两个谓词
函数
关于您的两个过滤器-$
功能已经成熟(注意,您
通过使谓词功能化,而不是
整个过滤过程(谓词隐藏)
因此,要使其工作,可以使用线程最后一个宏->
:
(->> array
filter-1
filter-2)
这是一种相当普遍的方法,您将经常在代码中看到
在野外。更一般的:
(->> xs
(filter pred?)
(map tf)
(remove pred?))
较新的方法是
,而
通过comp
进行组合。而这也将是解决问题的途径
实际上,将整个转换管道合并到一个新函数中
例如
请注意,在过滤器上使用了单参数版本。有一些选项可以组成处理步骤:
您可以像这样通过管道筛选调用:
(->> data
(filter #{"politrons" "hello"})
(filter #{"politrons"}))
;;=> ("politrons")
请注意,这些词集用作过滤函数(只是您的等式谓词的快捷方式)
但我想你需要知道的是这个概念,因为它的用途包括(但不限于)你需要的这种管道:
(eduction (filter #{"politrons" "hello"})
(filter #{"hello"})
data)
;;=> ("hello")
如果您只需要过滤,您还可以将过滤功能与更高级别的功能结合起来,如每个pred
:
(filter (every-pred #{"politrons" "hello"}
#(= "olleh" (clojure.string/reverse %)))
data)
;;=> ("hello")
查看线程宏:非常感谢,让我阅读该文档并尝试这种方法。哦,我不知道每个pred
,看起来->
和导出
类似,只是输入在最后。@AaronBell导出仍然使用传感器的功率-因此没有中间序列。
(filter (every-pred #{"politrons" "hello"}
#(= "olleh" (clojure.string/reverse %)))
data)
;;=> ("hello")