0

我正在学习决赛,我在这里有一个练习题。打电话给价值,名称/参考,需要在ML

的问题问的

val y = ref 1; 
fun f x = (!y) + (x + x); 
(f (y := (!y)+1; !y)) + (!y); 
在下列参数传递技术

结果:

  1. 打电话值
  2. 打电话名
  3. 打电话的需要。

在我看来,对于通过调用价值,答案是8 不过,我相信答案由名字叫也为8,但我希望它是不同的。其原因我认为是8:

  • Y:!=(!Y)+1 derefsÝ为1,加1,然后设置y为2
  • 的Y 3线作为参数来f,并且因为它被解除引用,所以 作为一个值而不是作为参考传递(这可能是我在 出错的地方?)
  • 函数调用返回6,但不会设置y,因为y已通过作为来自前一步骤的值
  • 6被添加到y的取消引用值中,其为2.
  • 该re转8 8

这是正确的答案,如果没有,请问有人能指出我出错的地方吗?另外,有人可以向我解释在这种情况下,按需拨打电话的方式吗?

非常感谢。

+0

看起来您正在解释如何按值处理。你是如何得到你的名称答案的? – 2014-12-07 23:33:24

+0

我解释的过程是我对如何使用按名称工作的理解。我认为这是错误的,因为正如你所说,它看起来与按价值划分的价值完全相同,但我不知道它是怎么错的。 – 2014-12-07 23:53:07

回答

1

我发现了它是如何工作的:

(y := (!y)+1; !y)是传递到f参数。 f然后看起来像:

fun f x = (!y) + ((y:= (!y)+1; !y) + (y:= (!y)+1; !y)); 

所以这种结束是1 + 2 + 3,和最后一步+ (!y)增加3,因为这是y的当前值,从而9.

感谢您指出我仍然在按价值收费。