在Clojure中解释`(apply partial partial args)`

时间:2015-12-11 18:48:12

标签: clojure partial

我在Programming Clojure书中记载了虚假咖喱。

user=> (defn faux-curry [& args] (apply partial partial args))
#'user/faux-curry
user=> (def add-3 ((faux-curry +) 3))
#'user/add-3
user=> (add-3 10)
13

然而,很难理解为什么身体需要两个部分。

Coluredocs.org中,我将(apply f args)视为应用函数的示例。如何解释(apply partial partial args)

1 个答案:

答案 0 :(得分:3)

我认为理解这一点的最简单方法是扩展每个部分。

(partial + 2)返回一个函数 (fn [& xs] (apply + 2 xs)) 调用结果函数调用+为1,所有后续args传递给partial。

(apply + 2 [3 4 5])(+ 2 3 4 5)

相同

(fn [& xs] ...)说“接受一系列参数并称之为xs” 这就像(fn [x1 x2 x3...] ...)

(partial partial)返回一个函数 (fn [& xs] (apply partial xs)) 它与partial具有完全相同的行为,因为它生成的函数直接使用所有参数调用partial

(apply partial partial args) 是相同的 (partial partial arg1 arg2...) 回报 (fn [& xs] (apply partial arg1 arg2... xs))

(apply partial partial [+ 1])产生 (fn [& xs] (apply partial + 1 xs))。 我们称这个结果为g(g 2) => (apply partial + 1 [2]) => (fn [& xs] (apply + 1 2 xs))。我们称这个结果为h(h 4 5) => (apply + 1 2 [4 5]) => (+ 1 2 4 5)

但如果你要省略其中一个部分: (apply partial [+ 1])产生 (fn [& xs] (apply + 1 xs))) 调用此结果函数不会返回函数,而是返回参数与1的结果。

因此观察了这些行为,让我们试着描述一下 (apply partial partial args)

“创建一个函数,该函数创建一个函数,在创建时使用提供的参数应用某些函数,并在调用时提供参数。”

因此faux-curry是一个函数,它创建一个创建函数o_O

的函数