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

时间:2013-04-30 13:35:43

标签: clojure

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

(apply map vector (vec jpgList)) 

我猜map和vector都是函数,但apply只需要一个函数。如何申请这两个函数?

4 个答案:

答案 0 :(得分: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将应用于函数vector,后跟(vec jpgList)的元素。与Haskell不同,Clojure的map支持多个集合进行操作。 (vec jpgList)可能是嵌套的向量或列表,如下例所示:

user=> (apply map vector [[1 2 3] [4 5 6]])
([1 4] [2 5] [3 6])  

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

答案 1 :(得分:5)

apply接受一个函数及其参数。如果使用两个以上的参数调用,则中​​间参数将作为标量参数添加(如使用partial)。见the documentation for 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")

全部将返回([1 \a] [2 \b] [3 \c] [4 \d])

答案 2 :(得分:2)

map正在“应用”。然而,map的第一个参数本身就是一个函数。在这种情况下,vector被添加到(vec jpgList)生成的参数序列中。 vector这里不是第二个应用的函数,它是序列中第一个与map一起应用的参数。

当应用任何本身将函数作为参数的高阶函数时,你会经常看到这个习语。

答案 3 :(得分:0)

考虑一下:

user=> (let [n1 1
  #_=>       n2 2
  #_=>       n-coll [n1 n2]]
  #_=>   (=
  #_=>    (apply + 999 n-coll)
  #_=>    (+ 999 n1 n2)))
true

'apply'将+应用于通过在n-coll前面加上999形成的参数列表。如果当相关集合由向量组成时,如果将map替换为+并将vector替换为999:

user=> (let [r1 [1 2 3]
  #_=>       r2 [4 5 6]
  #_=>       r-coll [r1 r2]]
  #_=>   (=
  #_=>    (apply map vector r-coll)
  #_=>    (map vector r1 r2)))
true