Clojure Map 中的递增值

0 functional-programming clojure

我决定尝试一下 Clojure。到目前为止,我真的很享受以不变和函数式的方式思考事物。但是,我偶然发现了一个我不知道如何优雅地解决的问题。

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

例如。

(def data ["a" "b" "c"])
(map (fn [x] (str x " is item number "  )) data)
Run Code Online (Sandbox Code Playgroud)

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

("a is item number 1" "b is item number 2" "c is item number 3")
Run Code Online (Sandbox Code Playgroud)

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

leo*_*ges 5

您需要的是一种将某些状态传送到包含当前项目索引的映射函数的方法。

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

这有什么帮助?如果您将第二个集合设为从零开始的无限序列,您的函数将被调用,参数为“a”和 0,然后是“b”和 1,依此类推:

(map (fn [x i] (str x " is item number " (inc i))) data (range))
Run Code Online (Sandbox Code Playgroud)

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

(map-indexed (fn [i x] (str x " is item number " (inc i))) data)
Run Code Online (Sandbox Code Playgroud)

第二个示例中仅有的两个不同之处是:参数的顺序颠倒了,您不需要提供第二个集合。