9

これは、clojure docs サイトからコピーしたミニコードのサンプルです。

(apply map vector (vec jpgList)) 

map と vector はどちらも関数だと思いますが、 apply は 1 つの関数しか取りません。ここで apply が 2 つの関数を使用するのはなぜでしょうか。

4

4 に答える 4

11

のドキュメントを読む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この関数は、行列演算とも呼ばれます。

于 2013-04-30T14:21:55.083 に答える
5

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])ます。

于 2013-04-30T14:27:02.410 に答える
2

map「適用」されているだけです。ただし、 の最初の引数mapは常にそれ自体が関数です。この場合vector、(vec jpgList) によって生成される一連の引数の先頭に追加されます。vectorここでは、2 番目の関数が適用されるのではなくmap、残りと共に適用されるシーケンスの最初の引数です。

このイディオムは、それ自体が関数を引数として取る高階関数を適用するときによく見られます。

于 2013-04-30T14:31:07.983 に答える