ここに私のミニコードのサンプルがあります。ここでは、clojureのドキュメントサイトからコピーしました。"apply map vector"イディオム - どうやって2つの関数になりますか?
(apply map vector (vec jpgList))
mapとvectorは両方とも関数だと思うが、applyは1つの関数しかとらない。ここには2つの機能がありますか?
ここに私のミニコードのサンプルがあります。ここでは、clojureのドキュメントサイトからコピーしました。"apply map vector"イディオム - どうやって2つの関数になりますか?
(apply map vector (vec jpgList))
mapとvectorは両方とも関数だと思うが、applyは1つの関数しかとらない。ここには2つの機能がありますか?
apply
のドキュメントを読む:
user=> (doc apply)
-------------------------
clojure.core/apply
([f args] [f x args] [f x y args] [f x y z args] [f a b c d & args])
Applies fn f to the argument list formed by prepending intervening arguments to args.
nil
をので、(apply map vector (vec jpgList))
はf x args
に対応し、そうmap
は(vec jpgList)
の要素が続い機能vector
、に適用されます。ハスケルとは異なり、Clojureのmap
は、複数のコレクションを操作することをサポートしています。 (vec jpgList)
は、おそらく次の例のように、ネストされたベクター、またはリストである:
user=> (apply map vector [[1 2 3] [4 5 6]])
([1 4] [2 5] [3 6])
あり、map
によって生産すべての要素がネストされたベクトルの要素の各n番目の要素のベクトルである起こりました。この機能は、マトリクス操作ではtranspose
とも呼ばれます。
apply
は、関数とその引数を受け入れます。 3つ以上の引数を指定して呼び出すと、中間の引数がスカラー引数として追加されます(partialを使用するなど)。言い換えればthe documentation for apply
を参照してください、これらの4つのすべては同じです。
(apply (partial map vector) [[1 2 3 4] "abcd"])
(apply map [vector [1 2 3 4] "abcd"])
(apply map vector [[1 2 3 4] "abcd"])
(map vector [1 2 3 4] "a b c d")
すべてが([1 \a] [2 \b] [3 \c] [4 \d])
を返します。
map
のみが適用されています。しかし、map
の最初の引数は、それ自身が関数です。この場合、vector
が(vec jpgList)によって生成された引数のシーケンスの先頭に追加されています。 vector
ここでは2番目の関数は適用されていません。それは残りの部分と一緒にmap
が適用されるシーケンスの最初の引数です。
引数として関数をとる任意の高次関数を適用すると、このイディオムが頻繁に表示されます。