2013-04-30 10 views

答えて

9

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とも呼ばれます。

5

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

2

mapのみが適用されています。しかし、mapの最初の引数は、それ自身が関数です。この場合、vectorが(vec jpgList)によって生成された引数のシーケンスの先頭に追加されています。 vectorここでは2番目の関数は適用されていません。それは残りの部分と一緒にmapが適用されるシーケンスの最初の引数です。

引数として関数をとる任意の高次関数を適用すると、このイディオムが頻繁に表示されます。

関連する問題