我编写了两段不同的代码,试图找出SML在函数参数方面使用的替换v.s.求值顺序。但结果让我很困惑。
玩具功能如下所示
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-9res = -4,它不以与上面相同的逻辑运行。
任何有关这方面的见解都将不胜感激!!
(我读过一些简单的例子,说明添加parens可以确定论点的结尾,但并不那么令人信服)
发布于 2017-07-27 13:29:16
pow x y - 1等同于(pow x y) - 1。foo示例也是如此,但是2 + (3 - 9)和(2 + 3) - 9的结果实际上是相同的,这就是为什么您看不到区别的原因。
https://stackoverflow.com/questions/45351859
复制相似问题