11.3.2计算策略的比较

[

evaluation、computation、calculation,在第二章,是后两个计算放在一起,让人搞不清准确的含义;现在倒好,出现了三个计算,又该如何体会呢?

据说,从左到右,是从粗略到精确的过度,即,前面的强调估算,后面的强调演算。

能体会出来吗?语言不同,表达真的不同。

因此,计算机就选了一个中间值,既不强调粗,也不强调精;恰恰表明,既强调粗,也强调精。

前两天,听电视里的一个新闻讲,俄罗斯人(好像是)能分辨出雪的 1000 种白色。

听到这里,就让我想到中国人,不太喜欢精确,不是有一句话,叫什么“天下乌鸦一般黑”,根本不分各黑的区别。

但是,这样说,又有点以偏概全。看看古书上关于煮饭的锅、喝酒的杯、装菜的盘的字,我们能认识几个。

]

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

[

这里的清单编号出了问题,从 11.14 一下变到 11.17。

好在这个不影响意思的表达。因此,译文也就译错如错吧。

]

清单11.14 延迟计算与提前计算


清单 11.17 延迟计算


清单 11.17 提前计算


PlusTen(TimesTwo(4))

// Start calculating PlusTen:

TimesTwo(4) + 10   [1]

// Calculate TimesTwo, because

// we need its result now:

8 + 10     [2]

// Calculate the result:

18


PlusTen(TimesTwo(4))

// To get values of all arguments,

// calculate result of TimesTwo:

PlusTen(8)     [3]

// Evaluate PlusTen next:

8 + 10     [4]

// Calculate the result:

18

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

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

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

时间: 2024-10-08 06:12:33

11.3.2计算策略的比较的相关文章

11.3.1.2 Haskell 的延迟计算策略

在延迟计算策略(lazy evaluation strategy)中,函数的参数值,在函数调用时不会计算,直到后来用到这个值时才计算.我们回到前面的例子: TestAndCalculate(Calculate(10)); 在这里,Haskell 直接跳转到TestAndCalculate 函数主体.Haskell 会记住参数值的名字叫 num,如果在后面需要 num 值,就会运行 Calculate(10),然后,继续执行,得到 TestCondition的结果.如果这个函数返回true,表示需

加权平均法,移动加权平均法,先进先出法(计算策略)

加权平均法,成本/数量=平均成本/个  用于前后进价相差幅度不大,且定期月末结转 移动加权平均法  ,若需要及时反映信息是    移动加权平均法属于加权平均法 接近市场价,  先进先出法:是一种有序计价的方法,策略,一批一批的来,第一批结算完再结算第二批.先购入先导出,这样计价更接近市场价. 加权平均法,移动加权平均法,先进先出法(计算策略)

11.3.1 不同的计算策略

Haskell 是一种纯函数式语言,有一个重要的方面,即,不允许任何副作用.有专门的技术在屏幕上输出,或处理文件系统,但对于程序员来说,它是以一种看起来不像有副作用的方式来实现.在这样的语言中,调整计算排序表达式的顺序是可能的:在Haskell 中,直到需要结果,才计算函数:这不会影响程序的结果,因为,函数没有副作用. C# 和 F# 的函数都可能有副作用,这是 F# 中的障碍,因此,语言提供多种方式避免,但仍然会在程序中出现.两种语言都需要指定表达式运行的顺序,否则,我们不可能确定哪个副作用先

11周(计算天数)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:计算天数 *作者:王忠 *完成日期:2014.10.30 *版本号:v1.0 * *问题描述:输入年月日 ,算出是该年的第几天 *输入描述:年月日 *程序输出:该年第几天 #include <iostream> using namespace std; int days(int y,int m,int d); int main() { int year,month,day;

【2016.12.11】JavaScrip计算自己活了多少天

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn"> <head> <met

有用函数编程

<序> 感谢 关于本书 关于封面 第一部分 学习函数式思维 第一章 不同的思维 1.1 什么是函数式编程? 1.2 通往有用函数编程之路 1.3 用函数式编程提高生产力 1.3.1 函数范式 1.3.2 声明式编程风格 1.3.3 了解程序的执行 1.3.4 设计并发友好的应用程序 1.3.5 函数风格怎样形成代码 1.4 函数式编程演示样例 1.4.1 用声明式风格表达意图 1.4.1.1 用 LINQ 处理数据 1.4.1.2 用 XAML 描写叙述用户界面 1.4.1.3 声明式函数动画

11.3.1.1 C# 和 F# 中的提前计算

在大多数主流的语言中,指定计算顺序的规则很简单:程序进行函数调用时,先计算所有的参数值,然后再执行函数.我们用前面的例子来演示: TestAndCalculate(Calculate(10)); 在所有的主流语言中,程序都会执行Calculate(10),然后再把结果作为参数值传递给TestAndCalculate.正如我们在前面的示例中已经看到的,如果函数 TestAndCalculate 不需要这个参数值,就很不幸了:在这种情况下,我们就无故地浪费了一些CPU 周期!这种策略称为提前计算策略

C#设计模式(20)——策略者模式(Stragety Pattern)

一.引言 前面主题介绍的状态模式是对某个对象状态的抽象,而本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方法的抽象,下面具体分享下我对策略模式的理解. 二.策略者模式介绍 2.1 策略模式的定义 在现实生活中,策略模式的例子也非常常见,例如,中国的所得税,分为企业所得税.外商投资企业或外商企业所得税和个人所得税,针对于这3种所得税,针对每种,所计算的方式不同,个人所得税有个人所得税的计算方式,而企业所得税有其对应计算方式.如果不采用策略模式来实现这样一个需求的话,可能

20.设计模式_策略者模式

一.引言 前面主题介绍的状态模式是对某个对象状态的抽象,而本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方法的抽象,下面具体分享下我对策略模式的理解. 二.策略者模式介绍 2.1 策略模式的定义 在现实生活中,策略模式的例子也非常常见,例如,中国的所得税,分为企业所得税.外商投资企业或外商企业所得税和个人所得税,针对于这3种所得税,针对每种,所计算的方式不同,个人所得税有个人所得税的计算方式,而企业所得税有其对应计算方式.如果不采用策略模式来实现这样一个需求的话,可能