0

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

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-needand下产生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.

谁能帮我指出正确的方向?我似乎无法弄清楚评估技术如何影响通过对上面的函数调用(以及抽象地对任何其他函数调用)执行的中缀操作(+ 或任何其他操作)的数量。

编辑:我的重点是了解哪里出了问题,如果我的结果不正确,以及我如何继续了解如何更准确地计算它们。我还可以补充一下,这是一个练习,包括多个类似的练习——每个练习都需要了解上述内容。

4

0 回答 0