【问题标题】: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)
    

    第二个例子中唯一的两个区别:参数的顺序是颠倒的,你不需要提供第二个集合。

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 2019-05-04
      • 2023-02-13
      • 1970-01-01
      • 2013-11-26
      • 2019-04-04
      • 2020-03-24
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多