提供的功能(从惰性函数式编程语言的角度来看):
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
and下产生call-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 计算为:
let n1
= n0
+ n0
let x = ( n0
+ n0
) +n1
总共进行了 3 次加法,因为n1
右边的值是由左边的加法 ( n0
+ n0
) 推断出来的。
我什至可以说,call-by-need
直到fun1(1)
and的结果fun2(1)
实际上是needed
.
谁能帮我指出正确的方向?我似乎无法弄清楚评估技术如何影响通过对上面的函数调用(以及抽象地对任何其他函数调用)执行的中缀操作(+ 或任何其他操作)的数量。
编辑:我的重点是了解哪里出了问题,如果我的结果不正确,以及我如何继续了解如何更准确地计算它们。我还可以补充一下,这是一个练习,包括多个类似的练习——每个练习都需要了解上述内容。