我决定投入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")
任何帮助我们的指导将不胜感激。
答案 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)
第二个例子中只有两个不同之处:参数的顺序是相反的,你不需要提供第二个集合。