增加Clojure Map中的值

时间:2016-02-22 02:06:41

标签: clojure functional-programming

我决定投入Clojure。到目前为止,我真的很乐意以不可变和功能的方式思考问题。但是,我偶然发现了一个我不知道如何优雅地解决的问题。

  

我想将地图应用于一组值,但我希望应用的函数为集合中的每个新值递增

例如

(def data ["a" "b" "c"])
(map (fn [x] (str x " is item number "  )) data)

我正在尝试在我的集合上映射一个函数,结果是:

("a is item number 1" "b is item number 2" "c is item number 3")

任何帮助我们的指导将不胜感激。

1 个答案:

答案 0 :(得分:4)

您需要的是一种将某种状态带入映射函数的方法,该函数包含当前项的索引。

这样做的一种方法是利用map这个事实,当给定多个集合作为输入时,它充当拉链并使用每个列表中的一个元素调用映射函数。

这有什么用?如果你使第二个集合成为从零开始的无限序列,你的函数将被调用参数“a”和0,然后是“b”和1等等:

(map (fn [x i] (str x " is item number " (inc i))) data (range))

事实证明,这是一种常见模式,而Clojure提供了一个核心功能 - map-indexed - 为此目的:

(map-indexed (fn [i x] (str x " is item number " (inc i))) data)

第二个例子中只有两个不同之处:参数的顺序是相反的,你不需要提供第二个集合。