【问题标题】:Incrementing Values in Clojure MapClojure Map 中的递增值
【发布时间】:2016-02-22 10:19:17
【问题描述】:
我决定一头扎进 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")
我们将不胜感激。
【问题讨论】:
标签:
clojure
functional-programming
【解决方案1】:
您需要一种将某些状态传送到包含当前项目索引的映射函数的方法。
做到这一点的一种方法是利用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)
第二个例子中唯一的两个区别:参数的顺序是颠倒的,你不需要提供第二个集合。