1

ClojureDocsでは、アセットはrefrencejavaタイプの配列でのみ機能することが記載されています。ただし、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を使用できなかったようです。

2つの質問があります:

  • 単純なマップロジックのプリミティブ配列を返すための適切なソリューションはありますか?
  • プリミティブ配列でアセットがサポートされていないのはなぜですか?
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 に答える