12.7.3 使用计算表达式进行重构
在前一章,我们讨论过重构函数式程序的方法,最后一个主题是延迟性,它变改代码的执行方式,而不影响程序的结果。从某种意义上讲,添加延迟性也可看作是一种重构技术;计算表达式的类似之处在于,增加额外的代码,但不改变核心意思。
提示
在计算表达式和延迟性之间有密切的关系,使用 Lazy 计算类型,创建能够把代码转换成延迟计算的计算表达式,是有可...
分类:
其他好文 时间:
2015-02-02 15:56:47
阅读次数:
190
12.8 第十二章小结
在本章的第一部分,我们讨论了 .NET 序列,用 IEnumerable 类型表示,在 F# 中还称为 seq 。我们开始讨论生成序列的技术,包括高阶函数、迭代器和 F# 序列表达式。我们知道,序列是延迟的,能够创建无穷序列。我们还看到了一个实际的示例,使用颜色的无穷的序列,把绘制图表的代码,与用于在图表中生成颜色的代码分离开来。
接下来,我们讨论了如何处理序列。...
分类:
其他好文 时间:
2015-02-02 15:52:18
阅读次数:
224
本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee
● 为什么想做一个表达式求值的程序
最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的。这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都...
分类:
其他好文 时间:
2015-02-01 19:13:30
阅读次数:
351
12.6 实现选项的计算表达式
在 12.4 节,我们用选项值作为示例,介绍了用 LINQ 查询和 F# 计算表达式创建非标准计算的概念,处理选项值的代码,有自定义的值绑定读取实际值,如同标准值。既然我们已经知道如何转换计算表达式,也就知道我们的 Bind 成员会接收值和 lambda 函数。因为我们处理的是选项类型计算表达式,只有当值是 Some(x) 而不是 None 时,我们才打算执...
分类:
其他好文 时间:
2015-02-01 17:50:08
阅读次数:
188
12.5.3 在 F# 中实现计算生成器
在计算表达式块前面的标识符,是类的实例,把所需的操作实现成为实例成员。许多操作都已经有了,我们根本不必要提供所有的,最基本的操作用 Bind 和 Return 成员实现。当 F# 编译器看到计算表达式,比如清单 12.18 时,会把它转换为使用这些成员的F# 代码。F# 示例转换成这样:
value.Bind(ReadInt(), fun ...
分类:
其他好文 时间:
2015-01-30 17:41:25
阅读次数:
153
12.5.2 写计算
C# 查询表达式和 F# 计算表达式,可以使用函数,行为方式非标准(返回单子值),就好像返回普通值。我们在这一节使用的计算类型是 ValueWrapper ,因此,原始函数将返回值的类型是 ValueWrapper,而不是 T。
实现这些函数,既可以使用其他的查询或计算表达式,也可以通过直接创建计算类型的值。有些计算表达式可以封装复杂的逻辑,所以,直接创建值可能有困...
分类:
其他好文 时间:
2015-01-30 16:08:33
阅读次数:
167
12.5.1 声明计算类型
在这个示例中,计算的类型(在 Haskell 术语中的单子类型)称为 ValueWrapper,它只是存储泛型类型参数T 的值,并不会为类型增加任何其他功能。这就是说,计算只处理标准值,但是,我们能够用 C# 中的查询表达式, F# 中的计算表达式,写代码(来增加功能)。
清单 12.17 显示了在 C# 和 F# 中的类型声明。在 C# 中,我们创建简单的类...
分类:
其他好文 时间:
2015-01-29 17:41:52
阅读次数:
196
12.4.2 自定义 F# 语言
到目前为止,我们所讨论过的序列表达式,都是用 seq 标识符表示,后面的代码块括在大括号中。然而,F# 还允许我们创建自己的标识符,给代码块以特殊的意义。通常,这个功能称为计算表达式(computation expressions),而序列表达式是它的一个特例,是由 F#核心所实现,并经编译器优化。
我们已经知道,计算表达式可以包含标准的语言结构,比如 ...
分类:
编程语言 时间:
2015-01-29 15:57:10
阅读次数:
253
(1)alert函数:显示一个警告对话框,包括一个OK按钮。
(2)confirm函数:显示一个确认对话框,包括OK、Cancel按钮。
(3)escape函数:将字符转换成Unicode码。
(4)eval函数:计算表达式的结果。
eval("x=10;y=20;document.write(x*y)");
document.write(ev...
分类:
编程语言 时间:
2015-01-29 15:54:46
阅读次数:
190
12.4 可选工作流(alternativeworkflows)
计算表达式(Computation expressions)是一种 F# 功能,部分灵感是来自Haskell 的单子(monads)。单子有个不好的名声,对于brain-bustingly 有困难的人来说,但是,也不用担心。我们将实现一组重要的方法,可以在 C# 中很好地处理 Option 值,以及在 F# 中的类似做法,如...
分类:
其他好文 时间:
2015-01-29 10:30:52
阅读次数:
168