clojuredocs.com中有一个猫的例子
(into [] (comp cat cat (map inc)) [[[1] [2]] [[3] [4]]])
据我所知,comp
从左到右应用fn,但以上示例似乎从右到左应用。我怎么读?
答案 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))