3

私は自分のコード(map #(% a) fns)でこのパターンに何度も出くわしました。ここで、a は文字列などの変数であり、fns は のような fns のシーケンスです[count #(split ",")]。このパターンをより簡潔に表現する方法はありますか?

4

4 に答える 4

3

もっと簡潔に?おそらくそうではありません。より良いイディオム?依存します。juxt任意の数の fn を引数として取り、それらを並置した関数を提供します。だから、map好きなものの代わりに使うことができます

(def a "foo,bar,baz")

(map #(% a) [count #(split % #",")])
;=> (11 ["foo" "bar" "baz"])

((juxt count #(split % #",")) a)
;=> [11 ["foo" "bar" "baz"]]

一方では、アプリケーションの怠惰なシーケンスがあり、他方では機能的な構成があります。どちらが良いかは、必要に応じて異なります。

于 2013-03-07T12:08:50.837 に答える
1

それを表現する簡単な方法:(for [f fns] (f a))

完全を期すためだけに追加されたもので、無名関数以上のものmapを好まない限り、ベースの式と同じくらい優れています。for

于 2013-03-07T15:36:34.810 に答える
0

パターンはすでに簡潔です。ただし、を表し、呼び出し可能でもある抽象化を作成する場合はfunction collection、次のように試すことができます。

(defmacro function-coll [param-count]
  (let [params (repeatedly param-count gensym)
        name (symbol (str "Functions-" param-count))]
    `(deftype ~name [fns#]
       clojure.lang.IFn
       (invoke [_ ~@params] (map #(% ~@params) fns#)))))


(function-coll 1)
(def one-fns (->Functions-1 [inc dec]))
(one-fns 10)

(function-coll 2)
(def two-fns (->Functions-2 [str vector]))
(two-fns :hello :world)
于 2013-03-07T16:27:16.680 に答える
0

ここでスラッシュオペレーターが必要だと思います。

user=> (-> "a b c d" 
       .toUpperCase 
       (.replace "A" "X") 
       (.split " ") 
       first)
"X"

http://clojuredocs.org/clojure_core/clojure.core/-%3E

http://clojuredocs.org/clojure_core/clojure.core/-%3E%3E

于 2013-03-07T16:29:40.730 に答える