"应用地图矢量"成语 - 如何成为2个功能?

ᐅde*_*ris 6 clojure

以下是我从clojure docs网站复制的迷你代码示例.

(apply map vector (vec jpgList)) 
Run Code Online (Sandbox Code Playgroud)

我猜map和vector都是函数,但apply只需要一个函数.怎么来这里申请需要两个功能?

Mic*_*ent 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
Run Code Online (Sandbox Code Playgroud)

所以,(apply map vector (vec jpgList))对应于f x args,所以map将应用于函数vector,其次是元素(vec jpgList).与Haskell不同,Clojure map支持多个集合进行操作.(vec jpgList)可能是嵌套的向量或列表,如下例所示:

user=> (apply map vector [[1 2 3] [4 5 6]])
([1 4] [2 5] [3 6])  
Run Code Online (Sandbox Code Playgroud)

发生的事情是,生成map的每个元素都是嵌套向量元素的每个第n个元素的向量.该函数也称为transpose矩阵运算.


Fra*_*ila 5

apply接受一个函数及其参数.如果使用两个以上的参数调用,则中​​间参数将作为标量参数添加(如使用partial).请参阅文档apply

换句话说,所有这四个都是相同的:

(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")
Run Code Online (Sandbox Code Playgroud)

一切都会回归([1 \a] [2 \b] [3 \c] [4 \d]).