计数在按名称调用和按需要调用

问题描述

提供函数(从惰性函数式编程语言的角度来看):

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-needcall-by-name 下屈服吗?当我试图解决这个问题时,根据这两种评估技术的知识,我会说:

call-by-need
fun1(1) = n + 1
fun2(1) = n + 1

call-by-name
fun1(1) = 2n + 1
fun2(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 (将#修改为@)