11.3.2计算策略的比较

11.3.2计算策略的比较

 

    通过使用第2章中描述的计算技术,我们可以演示不同的计算策略。可以展示了程序如何一步一步运行,这样,你就可以清楚地看到,延迟和提前计算之间的差异。清单 11.14 显示了一个表达式的计算,使用两个函数:PlusTen(a)  返回  a + 10,TimesTwo(a) 返回 a*2。

 

Listing 11.14 Lazy evaluation and eager evaluation

 

Listing 11.17 Lazy evaluation Listing 11.17 Eager evaluation

PlusTen(TimesTwo(4))

// Start calculating PlusTen:
TimesTwo(4) + 10

// Calculate TimesTwo, because
// we need its result now:
8 + 10

// Calculate the result:
18

PlusTen(TimesTwo(4))

// To get values of all arguments,
// calculate result of TimesTwo:
PlusTen(8)

// Evaluate PlusTen next:
8 + 10

// Calculate the result:
18

 

    延迟计算策略首先计算 PlusTen,而不先计算参数值。下一步,需要把 10 加到这个参数值,但是,这个参数值还没有计算。由于参数值是需要进一步处理,对 TimesTwo 的调用就执行,我们得到最终结果。

    提前计算战略首先计算参数值,所以,在第一步,它计算 TimesTwo(4),得到 8。给 PlusTen 函数的所有参数值,现在就已经都计算了,因此,它可以继续计算这个函数,计算出结果。

    到目前为止,我们只看到在使用延迟计算策略的一个动机,但是,它似乎已经很有用。如果它只存在于 Haskell 中,那为什么我们还把它提出来呢?在 F# 和 C# 3.0 中,可以实现类似的效果。

你可能感兴趣的:(table,程序,表达式,如何,展示)