reducer的map-indexed替代方案

时间:2017-04-03 10:21:41

标签: clojure

clojure.core.reducers是否有map-indexed替代方案?我希望像r/map一样懒散地工作(没有构建新的序列)。

1 个答案:

答案 0 :(得分:5)

我怀疑您真正想要使用的是transducer,因为map-indexed具有1-arity版本(mapfilter以及许多其他版本核心功能)返回一个传感器。传感器是可组合的,不会创建中间序列。这是一个简短的例子:

(def xf (comp
          (map-indexed (fn [i value] [i value]))
          (filter (fn [[i value]] (odd? i)))
          (map second)))

这表示:使用map-indexed生成索引向量,仅过滤掉索引为奇数的向量,并获取第二个元素。这是一种啰嗦的说(filter odd? collection)的方式,但它仅用于示例目的。

您可以将其与into

一起使用
(into [] xf "ThisIsATest")
=> [\h \s \s \T \s]

或者您可以使用transduce功能并将str应用于结果:

(transduce xf str "ThisIsATest")
=> "hssTs"