如何理解这个猫的例子?

时间:2019-06-13 09:21:16

标签: clojure cat

clojuredocs.com中有一个猫的例子

(into [] (comp cat cat (map inc)) [[[1] [2]] [[3] [4]]])

据我所知,comp从左到右应用fn,但以上示例似乎从右到左应用。我怎么读?

2 个答案:

答案 0 :(得分:2)

“秘密”在comp函数中,该函数从右到左应用函数,但对transducers it is left to right适用。

由于您正在转导,(comp cat cat (map inc))有点像
(fn [xs] (map inc (sequence cat (sequence cat xs))))(请注意,没有cat的版本需要coll)

答案 1 :(得分:2)

简短答案:comp-transducers基本上是从左到右运行它们。

从文档上方开始:

  

换能器由普通功能组成。换能器在决定是否调用换能器并调用多少次之前执行其操作。推荐的换能器组成方式是使用现有的comp函数:

     
(def xf
  (comp
    (filter odd?)
    (map inc)
    (take 5)))
     

换能器xf是一个转换栈,将通过一个过程应用于一系列输入元素。堆栈中的每个函数都在对其进行包装之前执行。 转换器的组成从右到左运行,但是构建了一个从左到右运行的转换堆栈(在此示例中,过滤发生在映射之前)

     

作为助记符,请记住comp中的换能器功能的顺序与->>中的序列转换的顺序相同。上面的转换等效于序列转换:

     
(->> coll
     (filter odd?)
     (map inc)
     (take 5))