Java Clojure在对基元数组调用amap时失败
在ClojureDocs上,它提到aset仅在引用java类型数组上可用。但是它没有提到amap的使用Java Clojure在对基元数组调用amap时失败,java,arrays,clojure,functional-programming,interop,Java,Arrays,Clojure,Functional Programming,Interop,在ClojureDocs上,它提到aset仅在引用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
(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
我有两个问题:
- 对于简单的映射逻辑,有没有简单的方法返回一个基元数组
- 原语数组为什么不支持aset
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])])
如果数组中的元素数量较少,则可以使用
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)
看起来更干净。如果您真的需要,您可以将计算的最终结果通过
转换为数组。谢谢,安库,这是我的错误!