【问题标题】:How to map a function that adds 5 to its argument?如何映射一个将 5 添加到其参数的函数?
【发布时间】:2014-10-10 18:03:17
【问题描述】:

请帮助我开始使用 Clojure。我已经搜索和阅读,但我看到的只是如何使用函数inc 添加数字1

我正在尝试了解map 的基本知识。我要做的就是将值5 添加到集合中的每个元素。我尝试了许多不同的方法,但没有什么能接近。这是一个可悲的不完整尝试:

(map (+ 5 ???) [0 1 2])

这一定很简单,但对于像我这样的非函数式程序员来说不是。

谢谢。

【问题讨论】:

    标签: clojure lambda functional-programming


    【解决方案1】:

    map 的第一个参数是您要应用于输入序列中每个元素的函数。您可以创建一个函数并提供它:

    (defn plus5 [x] (+ 5 x))
    (map plus5 [0 1 2])
    

    如果你不想声明一个命名函数,你可以创建一个匿名的内联函数,例如

    (map (fn [x] (+ 5 x)) [0 1 2])
    

    您可以将函数定义缩短为:

    (map #(+ 5 %) [0 1 2])
    

    【讨论】:

    • 谢谢。中间那个是我的目标。
    • 还有:(map (partial + 5) [0 1 2])
    【解决方案2】:

    (+ 5 ???) 是一个表达式,而不是一个函数。

    (defn foo [x] (+ 5 x)) 是一个命名函数。

    (fn [x] (+ 5 x)) 是一个匿名函数。

    #(+ 5 %) 是一种更快的匿名函数编写方式。

    这些行做你想做的事:

    (map foo [0 1 2])
    (map (fn [x] (+ 5 x)) [0 1 2])
    (map #(+ 5 %) [0 1 2])
    

    我发现this site 有时很有帮助,当我查看一种我以前从未见过的语言时。如果您搜索“功能”,您将找到有关如何定义它们的整个部分。在map 的官方 Clojure 文档中也有六个示例。这是针对 Scala 的,但 SO 上的 here's another answer 很好地解释了 map 和 reduce(左折叠)。

    【讨论】:

    • 非常感谢您提供的解决方案和参考资料!
    【解决方案3】:

    使用部分应用程序(参见partial)创建一个将5 添加到其参数的函数:

    (partial + 5)
    

    你可以自己试试:

    user> ((partial + 5) 10)
    ;; => 15
    

    现在将其映射到您的列表中:

    user> (map (partial + 5) [0 1 2])
    ;; => [5 6 7]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      相关资源
      最近更新 更多