Clojure - 适用于除第n个元素以外的所有元素

fyq*_*h95 2 clojure

我有一个看起来像这样的矢量:

[ "1" "2" "3" "4" ]
Run Code Online (Sandbox Code Playgroud)

我希望写一个函数返回向量:

[ 1 "2" 3 4 ]
; Note that the second element is still a string
Run Code Online (Sandbox Code Playgroud)

请注意,没有任何更改,返回一个全新的向量.在clojure中最简单的方法是什么?

Art*_*ldt 5

map-indexed是一个不错的选择.调用您传递的函数,其中包含输入项之一的值和找到它的索引(索引优先).该函数可以选择生成新值或返回现有值.

user> (map-indexed (fn [i v]
                     (if-not (= 1 i)
                       (Integer/parseInt v)
                       v))
                   [ "1" "2" "3" "4"])
(1 "2" 3 4)
Run Code Online (Sandbox Code Playgroud)

if返回v时,结果映射中的值完全相同,因此您可以在选择保留的部分中保留结构共享的好处.如果您希望将输出保存为向量,则可以使用mapv并传递自己的索引序列.

user> (mapv (fn [i v]
              (if-not (= 1 i)
                (Integer/parseInt v)
                v))
            (range)
            [ "1" "2" "3" "4"])
[1 "2" 3 4]
Run Code Online (Sandbox Code Playgroud)

有很多方法可以写这个