在 Clojure 中解释“(apply partial partial args)”?

Interpreting `(apply partial partial args)` in Clojure?

我在 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)

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

(partial + 2)return是一个函数 (fn [& xs] (apply + 2 xs)) 使用 1 调用生成的函数调用 + 并将所有后续参数传递给 partial.

(apply + 2 [3 4 5]) 等同于 (+ 2 3 4 5)

(fn [& xs] ...) 说 "take a sequence of arguments and call them xs" 这就像 (fn [x1 x2 x3...] ...)

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

(apply partial partial args) 是相同的 (partial partial arg1 arg2...) return秒 (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))) 调用此结果函数将不会 return 一个函数,而是将参数与 1 相加的结果。

观察到这些行为后,让我们尝试描述一下 (apply partial partial args):

"Create a function that creates a function that applies some function with the supplied arguments at creation time, and the supplied arguments at call time."

因此faux-curry是创建函数的函数,创建函数的函数o_O