私は、Clojure googleグループの議論から、基本的には、コレクションと任意の長さの関数のリストを取り、それをフィルタリングして元のリストのすべての要素を含む新しいコレクションを返すようにフィルタリングしています機能の少なくとも一つが真と評価:Clojure部分アプリケーション - 関数のコレクションを返すための 'map'の取得方法?
(defn multi-any-filter [coll & funcs]
(filter #(some true? ((apply juxt funcs) %)) coll))
私はProject Euler Problem 1に一般化ソリューションを作って遊んでいたので、私はこのようにそれを使用しています:
正しい答えを与える(def f3 (fn [x] (= 0 (mod x 3))))
(def f5 (fn [x] (= 0 (mod x 5))))
(reduce + (multi-any-filter (range 1 1000) f3 f5))
。
しかし、私はint型の任意の数を3と5を交換し、機能の折り返しを行うことができますどこで(
(reduce + (multi-any-filter (range 1 1000) 3 5))
のように、機能するのではなく、それにint型を渡すことができますので、それを変更したいです= 0(mod xy))を複数のany-filter関数の中の無名関数として扱います。
残念ながら、これは私のClojure能力の限界を超えています。私はargsのリストにmap
で何かする必要があると思っていますが、私はmap
がそれぞれ別の引数を待っている関数のリストを返す方法を知りません。 Clojureは、私が他の関数型言語でそれを行う方法を学んだやりかたをカリングするのをサポートしていないようです。おそらく私は正しい場所にpartial
を使用する必要がありますが、私はどのようにはっきりしていません。
つまり、(関数ではない)任意の数の引数を渡して、それらの引数のそれぞれを同じ関数にラップさせたい場合、その関数のリストはjuxt
に渡されます。上記の私のmulti-any-filter
機能でfuncs
の代わりに。
ありがとうございました!
これはまさに私が探していたものです。 – kyllo