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
12.4.1 自定义查询表达式
原则上,我们可以使用查询处理任何类型,只要它提供了绑定操作。这是函数式编程中这类函数的标准名称,像上一节类型签名所展示的。从技术角度来讲,我们需要实现一些方法,在把查询表达式转换为标准的函数调用,由 C# 编译器所使用。我们将为 12.6 节中的 Option 的类型实现这些方法,该类型没有实现 IEnumerable,所以,不能使用标准查询运算符。
我们...
分类:
其他好文 时间:
2015-01-29 14:34:50
阅读次数:
188
12.4 可选工作流(alternativeworkflows)
计算表达式(Computation expressions)是一种 F# 功能,部分灵感是来自Haskell 的单子(monads)。单子有个不好的名声,对于brain-bustingly 有困难的人来说,但是,也不用担心。我们将实现一组重要的方法,可以在 C# 中很好地处理 Option 值,以及在 F# 中的类似做法,如...
分类:
其他好文 时间:
2015-01-29 10:30:52
阅读次数:
168
12.3.3.3 在 C# 中使用平面映射
类似于 collect 函数的LINQ 运算符,是 SelectMany,但两者之间也有差异,因为 LINQ 有不同的要求。而 F# 序列表达式只能使用 collect 函数表示,LINQ 查询可以使用许多其它运算符,所以,对于序列操作,它们需要不同的方式。
我们再先看一下普通语法,然后,再考虑转换成使用显式扩展方法的语法,我们还使用前面的 F...
1. defferred对象实现链式回调函数编程。http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.htmldef.done(d,[d])def.fail(failCallb...
分类:
Web程序 时间:
2015-01-27 19:53:49
阅读次数:
146
12.3.3.2 直接使用平面映射
首先,我们要看看平面映射到底是什么样子。通常,理解函数如何运行的第一步,就是研究类型签名。图 12.2 比较了 Seq.map(普通映射)和 Seq.collect(平面映射)的类型签名。
图 12.2 对于每个输入元素,普通映射返回一个元素,而平面映射,可以返回元素的任意集合。
提醒一下,类型签名中的 # 号,描述映射函数,传递给...
分类:
其他好文 时间:
2015-01-25 18:18:48
阅读次数:
213
12.3.3.1 序列表达式中的平面映射
假设我们有一个关于城市的元组列表,每个元组包含城市的名字和它所在的国家,另外,我们还有一个列表,是用户所选的城市。因此,我们可以这样表示样本数据:
let cities = [ ("New York","USA"); ("London", "UK");
("Cambridge","UK"); ("Ca...
分类:
其他好文 时间:
2015-01-25 11:09:37
阅读次数:
182