Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 为同一集合组合函数_Clojure - Fatal编程技术网

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