【问题标题】: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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-06
        • 2011-08-23
        • 1970-01-01
        • 2019-02-26
        • 2012-08-27
        • 2018-04-24
        • 1970-01-01
        相关资源
        最近更新 更多