10

次のような関数での Clojure アリティ オーバーロードの例 (クックブックから抜粋):

(defn argcount
  ([] 0)                                ; Zero arguments
  ([x] 1)                               ; One argument
  ([ x &  args] (inc (count args))))    ; List of arguments

... アリティの低い関数がアリティの高い関数をいくつかのデフォルト値で単純に呼び出すことを許可していないように見えるフォームを使用します (これは Java の一般的なイディオムです)。そのために使用される他の特別な形式はありますか?

4

2 に答える 2

14

通常、高階関数とmap/を使用して他のアリティを参照する必要がない方法で、アリティの高い引数を表現する良い方法がありreduceます。この場合、それは非常に簡単です:

(defn argcount
  ([] 0)
  ([x] 1)
  ([x & args]
    (reduce + 1 (map (constantly 1) args))))

式の一般的な形式は次のとおりです。

(reduce reducing-function arity-1-value (map mapping-function rest-of-args))

この方法ですべてを行うことはできませんが、これは驚くほど多くの多引数関数で機能します。また、 を使用した怠惰の利点も得られるmapため、関数に 1,000 万個の引数をほとんど恐れることなく渡すなどのクレイジーなことを行うことができます。

(apply argcount (take 10000000 (range)))
=> 10000000

他のほとんどの言語で試してみると、スタックが乾杯します:-)

于 2013-02-10T02:54:20.847 に答える