无法通过逐个元素循环来更新向量

kos*_*tas 3 loops vector clojure

我试图通过循环设置向量的每个元素等于3.我明白了:

java.lang.ClassCastException:clojure.lang.PersistentVector无法强制转换为java.lang.Number

这是代码.

(def w [1 2 3])
(defn update [index value]
  (assoc w index value))

(loop [i -1]
  (if (< (count w) i)
    w
    (recur (update (+ i 1) 3))))
Run Code Online (Sandbox Code Playgroud)

ben*_*din 9

您的更新功能无法按预期方式工作.

(assoc w index value)
Run Code Online (Sandbox Code Playgroud)

生成一个基于w 的向量,除了索引处的元素现在是.它不会改变w.

user> (def w [1 2 3])
user> (assoc w 0 9)
    [9 2 3]
user> w
    [1 2 3]
Run Code Online (Sandbox Code Playgroud)

此外,您没有正确使用循环/重复.你开始循环,i绑定到-1,打算用它作为w的索引,但是recur调用循环不是使用i的下一个值,而是使用更新返回的w的更改副本.

尝试更像的东西:

(def w [1 2 3])
(loop [i 0, v w]
    (if (< (count w) i)
        v
        (recur (inc i) (assoc v i 3))))
Run Code Online (Sandbox Code Playgroud)

但是,由于您实际上并未使用索引来计算元素的新值,因此可以使用map而不是loop.由于只设置每个元素为恒定值,而不考虑其原来的值,可以使用Clojure的内置功能不断.

(vec (map (constantly 3) w))
Run Code Online (Sandbox Code Playgroud)

Map返回一个序列,我将它包装在对vec的调用中,将其转换回矢量.