在原始数组上调用amap时,Clojure失败了

时间:2013-02-17 08:20:38

标签: java arrays clojure functional-programming interop

在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无法在这种情况下使用。

我有两个问题:

  • 是否有任何简洁的解决方案可以为简单的地图逻辑返回原始数组?
  • 为什么原始数组不支持aset?

2 个答案:

答案 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