SML如何评估传递给currying函数的参数?

时间:2017-07-27 13:13:03

标签: functional-programming arguments currying smlnj operator-precedence

我写了两段不同的代码,试图找出替代值。评估顺序SML用于函数参数。但结果让我很困惑。

玩具功能如下

fun pow x y = if y=0 then 1 else x * (pow x y-1));

只有当我围绕表达式时才能正常工作,即 y-1 与parens。所以我用一个简单的打印语句来增加它,以跟踪发生了什么。

fun pow x y = (print("y is: "^ Int.toString(y)^"\n");
if y = 0 then  1 else x * (pow x y-1))

它的运行方式类似于每次调用函数时y值保持不变(显然y-1在这里没有正确评估或解析。)

然而,我在下面写的另一个虚拟代码完全符合我的期望。

fun foo x y= x+y;
val res= foo 2 3-9

res = -4,它没有与上面相同的逻辑运行。

对此有任何见解将不胜感激!!

(我已经阅读了一些关于添加parens的简单说明,可以确定参数的结束位置,但它并不那么令人信服)

1 个答案:

答案 0 :(得分:1)

pow x y - 1相当于(pow x y) - 1。您的foo示例也是如此,但2 + (3 - 9)(2 + 3) - 9实际上具有相同的结果,这就是您没有看到差异的原因。