如何使用以下嵌套partial
评估数据结构:((partial (partial - 3)6)9)
。内部partial
产生-3,然后我们有((partial -3)9)
。
但是为什么部分为什么会产生(-3 -
9)?它从何处获得减法指令?
我想对Clojure读取和评估此数据表示的方式有所帮助。
答案 0 :(得分:10)
在评估此表达式的过程中调用((partial - 3) 6)
的说法不正确,这是误解的核心。
为了简化这一点,让我们分解一下:
((partial (partial - 3) 6) 9)
...而是将其重写为:
(let [p1 (partial - 3)]
((partial p1 6) 9)
现在,(partial p1 6)
会返回什么?调用p1
的函数,其第一个参数为6
,并附加任何后续参数。因此,我们可以再次更详细地写出:
(let [p1 (partial - 3)
p2 (partial p1 6)]
(p2 9)
因此,(p2 9)
调用(p1 6 9)
,调用(- 3 6 9)
。永远不会在执行过程中的任何地方调用(- 3 6)
,因此在最终调用所有参数之前,-
的初始函数调用永远不会消耗。
(实际实现可以优化中间调用,将p1的参数折叠为p2,但不需要将这些优化合并到概念模型中;行为等同于上面的内容。)