我在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)
?
答案 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