7

次の例を新しいClojure1.5レデューサーライブラリに変換しようとしています。

(reduce max (map inc (range 10))) 
;=> 10

変更すると、次のエラーが発生します。

(r/fold max  (r/map inc (range 10)))
;ArityException Wrong number of args (0) passed to: core$max  clojure.lang.AFn.throwArity (AFn.java:437)

誰かが私に正しい解決策を教えてもらえますか?

4

1 に答える 1

12

maxで置き換えると機能することに注意してください+

(r/fold + (r/map inc (range 10)))
; => 55

違いは、とは異なり+ 、引数のない呼び出しの場合max がないという事実です。引数なしで呼び出されたときにID値を提供するためr/foldに、結合関数が必要です。それのmaxために、それのために。*1+0

max'考えられる解決策は、として機能するを定義することですmaxが、引数なしで呼び出されると、負の無限大を返します— <ahref ="https://en.wikipedia.org/wiki/Identity_element"rel="noreferrer">アイデンティティ関数の要素max

(defn max'
  ([] Double/NEGATIVE_INFINITY)
  ([& args] (apply max args)))
(r/fold max'  (r/map inc (range 10)))
; => 10

この関数を使用しても同じ結果を得ることができますr/monoid

(r/fold (r/monoid max #(Double/NEGATIVE_INFINITY)) (r/map inc (range 10)))

詳細については、「レデューサー-コレクション処理用のライブラリとモデル」のセクション「シンプルさは機会」を参照してください。

于 2013-01-07T09:28:53.523 に答える