これは、clojure docs サイトからコピーしたミニコードのサンプルです。
(apply map vector (vec jpgList))
map と vector はどちらも関数だと思いますが、 apply は 1 つの関数しか取りません。ここで apply が 2 つの関数を使用するのはなぜでしょうか。
これは、clojure docs サイトからコピーしたミニコードのサンプルです。
(apply map vector (vec jpgList))
map と vector はどちらも関数だと思いますが、 apply は 1 つの関数しか取りません。ここで apply が 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
、関数 に適用されvector
、その後に の要素が続き(vec jpgList)
ます。Haskell とは異なり、Clojuremap
は操作対象として複数のコレクションをサポートしています。(vec jpgList)
おそらく、次の例のように、ネストされたベクトルまたはリストです。
user=> (apply map vector [[1 2 3] [4 5 6]])
([1 4] [2 5] [3 6])
何が起こったかというと、によって生成されるすべてmap
の要素は、ネストされたベクトルの要素の各 n 番目の要素のベクトルです。transpose
この関数は、行列演算とも呼ばれます。
apply
関数とその引数を受け入れます。2 つ以上の引数で呼び出された場合、中間の引数はスカラー引数として追加されます (部分的な使用のように)。のドキュメントを参照してください。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
、残りと共に適用されるシーケンスの最初の引数です。
このイディオムは、それ自体が関数を引数として取る高階関数を適用するときによく見られます。