
计算表达式
文章平均质量分 75
心想才事成
这个作者很懒,什么都没留下…
展开
-
12.5.2 写计算
12.5.2 写计算 C# 查询表达式和 F# 计算表达式,可以使用函数,以非标准方式的行为(通过返回一些一元值) ,就好像返回普通的值。我们在这一节中使用的计算类型是 ValueWrapper ,因此,原始函数将返回ValueWrapper 类型的值,而不只是 T。 实现这些函数,既可以使用另外的查询或计算表达式,也可以通过直接创建计算类型的值。有些计算表达式可以封装复翻译 2011-11-17 11:39:58 · 557 阅读 · 0 评论 -
12.6 实现选项的计算表达式
12.6 实现选项的计算表达式 在 12.4 节中,我们用选项值作为示例,介绍了用 LINQ 查询和 F# 的计算表达式创建非标准计算的概念。我们所写的代码处理选项值,有自定义的值绑定来读取实际值,就好像是一个标准值。我们已经看到如何转换计算表达式,知道我们的 Bind 成员会接收一个值,和一个 lambda 函数。我们只想执行这个 lambda 表达式,有我们的选项类型计翻译 2011-11-18 16:25:41 · 688 阅读 · 0 评论 -
12.7.1 创建日志记录的计算
12.7.1 创建日志记录的计算 这个计算将产生一个值,并能够将消息写入到本地日志记录的缓冲区。这意味着,计算的结果将是一个值,和包含这些消息的字符串列表。再次,我们还是使用有一个识别器的差别联合,表示这个类型: type Logging = | Log of 'T * list 这个类型非常类似于我们先前讨论的 ValueWrap翻译 2011-11-18 20:42:43 · 582 阅读 · 0 评论 -
12.7.3 使用计算表达式进行重构
12.7.3 使用计算表达式进行重构 在前一章中,我们看到一些重构函数式程序的方法。最后一个主题是延迟性,它变改代码的执行方式,而不影响程序的结果。从某种意义上讲,添加延迟性也可看作是一种重构技术。计算表达式类似之处在于,它们增加其他方面的代码,而不改变其核心意义。 提示 在计算表达式和延迟性之间有密切的关系,创建一个计算表达式,把代码转换翻译 2011-11-19 15:34:00 · 593 阅读 · 0 评论 -
12.7.2 创建日志记录计算
12.7.2 创建日志记录计算 清单 12.24 首先开始通过实现两个辅助函数,用于读取和写入控制台。两者还会把一条消息写入日志,所以,它们将括在 log 计算块中。为了显示如何组合非标准计算,我们在第三个函数中,使用了这两个函数。在我们前面的示例中,使用 let! 基元,但是,清单 12.24 还引入了 do!。 Listing 12.24 Logging u翻译 2011-11-19 14:29:23 · 520 阅读 · 0 评论 -
12.7 给计算增加日志记录
12.7 给计算增加日志记录 日志通常可以使用全局可变状态实现。然而,如果我们想要避免使用全局可变状态,并保持程序的纯函数性,又会如何呢?我们会有一个选择,就是把日志记录器的状态作为额外的参数值,传递我们要调用的每个函数。实现可能非常困难(想象一下,如果我们决定将另一个参数添加到这个状态中!)。 要解决这个问题,我们可以创建一个自定义计算类型,启用日志记录,隐藏翻译 2011-11-18 18:25:30 · 658 阅读 · 0 评论 -
12.5.3 在 F# 中实现计算生成器
12.5.3 在 F# 中实现计算生成器 在计算表达式块前面的的标识符,是一个类的实例,它把所需的操作实现成为一个实例成员。许多操作都是可用的:我们不必要支持所有的。用 Bind 和 Return 成员实现最基本的操作。当 F# 编译器看到计算表达式时,就像清单 12.18 中的,它会将计算表达式转换为 F# 代码,使用这些成员。转换的 F# 示例如下所示: value.B翻译 2011-11-17 16:49:32 · 770 阅读 · 0 评论 -
12.5.4 在 C# 中实现查询运算符
12.5.4 在 C# 中实现查询运算符 当我们在清单 12.14 中,讨论序列和分析 SelectMany 操作时,已经看到如何把 C# 查询转换为方法调用。我们将只支持查询以 select 子句结尾,而忽视那些仅对集合有用的情况,比如分组。这意味着,我们就需要实现 Select 扩展方法。 我们前面说过,第二个和随后的 from 子句被转换成对 Select翻译 2011-11-17 18:06:14 · 619 阅读 · 0 评论 -
12.5.1 声明计算类型
12.5.1 声明计算类型 在这个示例中的计算类型(在 Haskell 术语中的一元类型)称为 ValueWrapper,它只是存储泛型类型参数 t 的值,并不会为这个类型增加任何其他功能。这意味着,这个计算只处理标准值,但是,我们能够写代码(来增加功能),用 C# 中的查询表达式, F# 中的计算表达式。 清单 12.17 显示了在 C# 和 F# 中的类型声明翻译 2011-11-17 09:25:12 · 514 阅读 · 0 评论 -
12.5 自定义计算的第一步
12.5 自定义计算的第一步 本节中的示例并没有任何实际的用处,但是,它演示了一些核心概念。设计自定义计算中的第一个任务就是,考虑由这个计算生成的值所表示的类型。翻译 2011-11-17 08:53:36 · 541 阅读 · 0 评论 -
15.3.4 在 C# 中实现提升与映射
15.3.4 在 C# 中实现提升与映射 提升函数和映射操作是构建行为的核心,所以,在该项目的 C# 版本中也需要它们。在前面探讨 F# 版本之后,对于这些函数应该做什么,你会有一些概念,所以,我们不会详细讨论全部内容。C# 版本与 F# 代码的差异很有趣。 每当我们看到 F# 中的 map 函数,在 C# 中使用 Select。这是 LINQ 中使用的标准术语,所以,我翻译 2011-12-19 10:54:11 · 786 阅读 · 0 评论