clojure では、関数を一連の値にマップできます。単一の値をパラメーターとして一連の関数にマップする組み込み関数はありますか?
(map inc [1 2 3 4])
; -> (2 3 4 5)
(reverse-map [inc dec str] 1)
; -> (2 0 "1")
(reverse-map [str namespace name] :foo/bar/baz)
; -> (":foo/bar/baz" "foo/bar" "baz")
clojure では、関数を一連の値にマップできます。単一の値をパラメーターとして一連の関数にマップする組み込み関数はありますか?
(map inc [1 2 3 4])
; -> (2 3 4 5)
(reverse-map [inc dec str] 1)
; -> (2 0 "1")
(reverse-map [str namespace name] :foo/bar/baz)
; -> (":foo/bar/baz" "foo/bar" "baz")
juxt
少し似ているところがあります。いくつかの関数を取り、その引数を各関数に渡し、戻り値のベクトルを返す関数を返します。そう:
> ((apply juxt [inc dec str]) 1)
[2 0 "1"]
主な違いは、もちろん熱心な (つまり、怠惰ではない) ベクトルを作成することです。オリジナルmap
は、怠惰なシーケンスを作成します。
juxt
複数の引数を持つ関数でも機能します。
> ((apply juxt [* / -]) 6 2)
[12 3 4]
あるかどうかはわかりませんが、実装はかなり簡単です。
(def reverse-map (fn [l value] (map #(% value) l)))
特に作曲能力があるため、怠惰が必要ない場合は、juxt を使用することをお勧めします。ただし、map と repeat を使用する多項関数の逆マップの簡単なバージョン (どちらも遅延) は、次のようになります。
(defn reverse-map
[fcoll & args]
(map apply fcoll (repeat args)))
=> (reverse-map [inc dec str] 1)
(2 0 "1")
=> (reverse-map [* / -] 6 2)
(12 3 4)
わかりました、アイデアを投入するために、juxt と同じ構成可能性を持つバージョンを次に示します。そして、それは怠け者のようです!
(defn lazy-juxt
[& funs]
(fn [& args]
(map apply funs (repeat args))))
=> ((juxt inc dec str) 1)
[2 0 "1"]
=> ((lazy-juxt inc dec str) 1)
(2 0 "1")
=> ((juxt * / -) 6 2)
[12 3 4]
=> ((lazy-juxt * / -) 6 2)
(12 3 4)