Clojure:将列表/向量的每一项增加其第一个元素

bla*_*ned 0 clojure

我的尝试:

(defn inc-by-f [v]
      map #(+ (first v) %) v)
Run Code Online (Sandbox Code Playgroud)

编辑

(最初的问题很愚蠢;我错过了括号。我还在留下这个问题,以便我学习一些新的方法来处理它。)

(defn inc-by-f [v]
  (map #(+ (first v) %) v))
Run Code Online (Sandbox Code Playgroud)

还有什么其他很酷的“Clojure”方法可以达到预期的效果?

tar*_*tar 5

“Cooler”方式(Bob Jarvis 的回答晚于/sf/answers/4377580931/):

(defn inc-by-f
  [[v1 :as v]]
  (map (partial + v1) v))
Run Code Online (Sandbox Code Playgroud)

这使用

请注意,向量解构仅在增量值位于易于解构访问的位置时才有用。[_ v2 :as v]例如,如果该值是“向量中的第二个”( ),则它可以工作,但如果该值是“向量中的最大元素”,则它不起作用。在这种情况下,必须明确获得最大值,例如

(defn inc-by-max
  [v]
  (map (partial + (apply max v)) v))
Run Code Online (Sandbox Code Playgroud)

另请注意,匿名函数在每次调用时都会进行评估,不像partial它会传递所有参数,然后不再需要评估这些参数。换句话说,如果我们v在匿名函数中获取1000 个元素的第一个元素,这将导致 1000 次调用first,而不是如果我们获取第一个元素并将其传递给partial。示范:

user=> (dorun (map #(+ (do (println "called") 42) %) (range 3)))
called
called
called
=> nil
user=> (dorun (map (partial + (do (println "called") 42)) (range 3)))
called
=> nil
Run Code Online (Sandbox Code Playgroud)