首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为同一集合组合函数

为同一集合组合函数
EN

Stack Overflow用户
提问于 2021-01-18 18:18:39
回答 2查看 104关注 0票数 0

我刚开始学习Clojure,并且我已经习惯于使用其他函数式语言来创建一些具有如下函数的管道

代码语言:javascript
复制
val result = filter(something)
             map(something)
             reduce(something)
         collection

我正在尝试使用Clojure组合两个filter函数来实现类似的功能

代码语言:javascript
复制
(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)))

但我不能让它工作。

您是否可以提供一些建议或文档,说明如何为同一个collection组合两个predicate函数

问候

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-18 18:34:13

您的两个filter-$函数已经完全成熟(请注意,通过使您的谓词函数而不是隐藏谓词的整个过滤,您将获得更多的可重用性)。

因此,要使其工作,可以使用线程最后一个宏->>

代码语言:javascript
复制
(->> array
     filter-1
     filter-2)

这是一种相当通用的方法,你会经常在野外的代码中看到。更一般的情况:

代码语言:javascript
复制
(->> xs
     (filter pred?)
     (map tf)
     (remove pred?))

较新的方法是transducers,它通过comp完成组合。这也是将整个转换管道实际合并到一个新函数中的方法。

例如。

代码语言:javascript
复制
(def my-xf
 (comp 
   (filter pred1)
   (filter pred2)))

(into [] my-xf xs)

请注意在filter上使用的是单参数版本。

票数 5
EN

Stack Overflow用户

发布于 2021-01-18 18:40:44

有一些选项可以组成处理步骤:

您可以像这样对调用进行管道过滤:

代码语言:javascript
复制
   (->> data
        (filter #{"politrons" "hello"})
        (filter #{"politrons"}))
   ;;=> ("politrons")

请注意,这些单词集将用作过滤函数(只是您的那些相等谓词的快捷方式)

但我猜你需要知道的是transducers的概念,因为它的用法包括(但不限于)你需要的这种类型的流水线:

代码语言:javascript
复制
(eduction (filter #{"politrons" "hello"})
          (filter #{"hello"})
          data)
;;=> ("hello")

如果您只需要过滤,您还可以将过滤函数与更高级别的函数(如every-pred )结合使用

代码语言:javascript
复制
(filter (every-pred #{"politrons" "hello"}
                    #(= "olleh" (clojure.string/reverse %)))
        data)
;;=> ("hello")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65772588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档