在ClojureDocs上,它提到aset仅适用于refrence java类型的数组。但它没有提及amap的使用。
(reduce
(fn [#^doubles sum #^doubles prob]
(println sum)
(amap ^doubles sum idx ret
(fn [x] (println x) (+ x (get prob idx)))))
(double-array 3 (double 0))
[(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])])
以上代码失败并显示以下错误消息
IllegalArgumentException找不到匹配的方法:aset clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:80)
似乎amap无法在这种情况下使用。
我有两个问题:
答案 0 :(得分:2)
您错误地使用了amap
。 amap的最后一个参数应该是一个表达式,而不是你所使用的函数(如法线贴图)。
(reduce
(fn [^doubles sum ^doubles prob]
(println sum)
(amap ^doubles sum idx ret
(+ (aget sum idx) (aget prob idx))))
(double-array 3 (double 0))
[(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])])
答案 1 :(得分:1)
如果数组包含少量元素,则可以使用map
:
(apply map + [(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])
(double-array [1.0 2.0 3.0])])
=> (5.0 10.0 15.0)
看起来更干净。如果你确实需要的话,你可以将计算的最终结果转换为数组into-array
。