Clojure中的嵌套部分视图

3
以下是翻译:
在以下嵌套的partial中,数据结构如何得到评估:((partial (partial - 3)6)9)。内部的partial产生-3,然后我们有((partial -3)9)。 但是,为什么partial然后进行(-3 - 9)呢?它从哪里获取减法指令呢?
我想了解Clojure对这种数据表示方式的读取和评估方式。

确切地说,我知道这个。这就是为什么有问题! - user4813927
现在扩展后的答案是否有意义? - Charles Duffy
从概念上讲,备份很重要的一点是要意识到“-”函数可以接受两个以上或两个以下的参数。 - Charles Duffy
1个回答

10

在计算表达式的过程中调用了((partial - 3) 6)这一说法是错误的,这是误解核心所在。

为了让它更简单易懂,我们来分解一下:

((partial (partial - 3) 6) 9)

而是将其改写为:

(let [p1 (partial - 3)]
  ((partial p1 6) 9)

现在,(partial p1 6) 返回什么?它返回一个调用 p1 函数的函数,其第一个参数为 6,并附加任何后续参数。因此,我们可以再次更详细地编写它:

现在,(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 中,但没有必要将这样的优化纳入概念模型中;行为等同于上述描述。)

谢谢。我没有声称 (partial - 3) 会产生 -3,我的意思是 ((partial - 3)6) 会产生 -3,然后将其作为参数传递给外部的 partial 函数。 - user4813927
1
@amirteymuri ((partial - 3) 6) 确实会得到-3,但是这个表达式在你的问题的代码中并不存在!相反,你有(partial (partial - 3) 6),这确实是一件完全不同的事情,正如Charles Duffy在他的回答中所解释的那样。 - amalloy
@amalloy,感谢您的重新陈述 - 这实际上帮助我更好地理解原始问题,从而修改它以使其更加准确。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接