我写了两段不同的代码,试图找出替代值。评估顺序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的简单说明,可以确定参数的结束位置,但它并不那么令人信服)
答案 0 :(得分:1)
pow x y - 1
相当于(pow x y) - 1
。您的foo示例也是如此,但2 + (3 - 9)
和(2 + 3) - 9
实际上具有相同的结果,这就是您没有看到差异的原因。