我正在尝试通过循环将向量的每个元素设置为等于 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))))
最佳答案
您的更新功能无法按您预期的方式工作。
(assoc w index value)
基于 w 生成一个新向量,除了 index 处的元素现在是 value。它不会改变 w .
user> (def w [1 2 3])
user> (assoc w 0 9)
[9 2 3]
user> w
[1 2 3]
此外,您没有正确使用循环/递归。您从 i 绑定(bind)到 -1 开始循环,打算将其用作 w 的索引,但 recur 不是使用 i 的下一个值调用循环,而是使用 update 返回的 w 的更改副本。
尝试更多类似的东西:
(def w [1 2 3])
(loop [i 0, v w]
(if (< (count w) i)
v
(recur (inc i) (assoc v i 3))))
但是,由于您实际上并未使用索引来计算元素的新值,因此您可以使用 map 而不是循环。由于只是将每个元素设置为常量值而不考虑其旧值,因此您可以不断使用 clojure 的内置函数。
(vec (map (constantly 3) w))
Map 返回一个序列,我将其包装在对 vec 的调用中,以将其转换回向量。
关于loops - 无法通过逐个元素循环来更新向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594641/