【问题标题】:what is the difference between apply and no-apply and partial in clojure?clojure 中的 apply 和 no-apply 和 partial 有什么区别?
【发布时间】:2014-09-28 22:44:09
【问题描述】:
在这段代码中,
user> (= (apply partial partial [+])
(partial partial +))
false
user>
有什么区别
(应用部分部分 [+])
和
(部分偏+)
?
在这段代码中,
user> (= (apply + [])
(+))
true
那为什么返回值不为假呢?
【问题讨论】:
标签:
clojure
functional-programming
【解决方案1】:
Clojure 中没有函数相等的一般定义。有一个平凡的身份,如果两个对象相同,则它们应用为相等。但是 partial 创建了一个新对象。例如:
user> (= (partial + 0) (partial + 0))
false
作为人类读者,我们可以看到它们是相同的功能(并且两者都与+ 本身的功能相同)。但是 Clojure 语言中没有允许确定这种相等性的逻辑。
【解决方案2】:
自从
(apply + [])
;0
(+)
;0
...然后
(= (apply + []) (+))
;true
...以及,进一步到@noisesmith's answer,
(= (partial +) +)
;true
... 因为partial 带有一个参数会返回它。
(partial +)
;#<core$_PLUS_ clojure.core$_PLUS_@5746e7cc>
+
;#<core$_PLUS_ clojure.core$_PLUS_@5746e7cc>
但是partial 带有几个参数构造一个匿名函数对象。只有当它们相同时,函数才相等 - 相同的对象。对partial 的两次这样的调用——即使使用相同的参数——也会产生两个不同的因此不相等的对象。
(partial partial +)
;#<core$partial$fn__4198 clojure.core$partial$fn__4198@23f4ebfe>
(partial partial +)
;#<core$partial$fn__4198 clojure.core$partial$fn__4198@7d41b16b>