1

在 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.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?
4

2 回答 2

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])]) 
于 2013-02-17T09:06:52.670 回答
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如果你真的需要它,你可以将计算的最终结果转换为数组。

于 2013-02-17T16:55:43.527 回答