问题描述
fun1(`n0`) = let `n1` = `n0` + `n0` in
let `n2` = `n1` + `n1` in
...
let x = `nn` + `nn` in
x
fun2(`n0`) = let `n1()` = `n0` + `n0` in
let `n2()` = `n1()` + `n1()` in
...
let x = `nn()` + `nn()` in
x
fun1(1)
fun2(1)
会在 call-by-need
和 call-by-name
下屈服吗?当我试图解决这个问题时,根据这两种评估技术的知识,我会说:
call-by-need
:fun1(1)
= n + 1fun2(1)
= n + 1
call-by-name
:fun1(1)
= 2n + 1fun2(1)
= 2n + 1
但是谁能验证以上值是否正确?两者之间的主要区别(根据我的理解)是 call-by-name
需要在每次使用变量时重新评估变量。 call-by-need
下的情况并非如此。举个例子:
fun1(1)
= 2n + 1\
其中 n = 1 的计算为:
让n1
= n0
+ n0
让 x = (n0
+n0
) + n1
总共进行了 3 次加法,因为右边的 n1
的值是由左边的加法 (n0
+n0
) 推断出来的。
我什至可以说在 call-by-need
下没有添加,直到 fun1(1)
和 fun2(1)
的结果实际上是 needed
。
谁能帮我指明正确的方向?我似乎无法弄清楚评估技术如何影响通过上面的函数调用(以及抽象到任何其他函数调用)执行的中缀操作(+ 或任何其他)的数量。
编辑:我在这里的重点是了解什么是错误的,如果我的结果不正确,以及我如何继续了解如何计算它们准确。我还可以补充一点,这是一个练习,其中包括多个类似的练习——每个练习都需要理解上述内容。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)