- 博客(22)
- 资源 (7)
- 收藏
- 关注
翻译 8.3.3 F# 代码的进一步演变
8.3.3 F# 代码的进一步演变 在上一节中,我们从一段简单的 F# 代码,它存储一个函数的列表,到更复杂的版本,使用记录的列表。这正是我们第 1 章中讨论的 F# 开发过程的一部分。我们学习过, F# 程序通常是非常简单的脚本开始,演变成标准的遵循 .NET 编程准则的代码,好处来自 .NET 对象模型。 我们开始用最简单的方法来解决问题,仅使用我们在开头所知道的。当
2011-06-30 15:47:00 507
翻译 8.3.2 构建组合行为
8.3.2 构建组合行为 在清单 8.11 中,验证最低收入和当前工作最小年份的检查和报表函数中,有明显的重复。这些检查有类似的结构:都检查客户的某一属性是否小于最小的允许值。 找出共性是只删除重复第一步。下一步是要看 checkJobYears 和 checkIncome 函数(连同其报表函数)的哪部分是不同的: ■ 检查不同的属性。 ■ 使用不同的
2011-06-30 09:54:00 424
翻译 8.3.1 函数的记录
8.3.1 函数的记录 我们已经看到一个处理多个函数的方式。在前面的示例中,我们返回一个函数元组作为结果,可以用相同的技术,来表示有新的报表功能的应用程序。我们说,这个报表函数取客户端、打印一些内容到屏幕上,返回 unit 作为结果。使用这种表示,行为列表的类型将是 ((Client -> bool) * (Client -> unit)) list 开始
2011-06-28 17:14:00 424
翻译 8.3 处理组合行为
8.3 处理组合行为 在这一章中,我们正在讨论处理行为的应用程序或组件,允许在开发周期的后面添加新的行为,甚至在运行时。关键的设计原则是要确保添加新的行为要尽可能容易。在我们实现新的功能之后,应该可以注册这个函数(例如,通过将其添加到列表),并使用这个应用程序,在代码上没有任何其他改变。 为了简化事情,最好是最小化需要实现函数的数量。通常情况下,单一的函数足以表示功能,但
2011-06-27 11:31:00 392
翻译 8.2.3 在 F# 使用闭包捕获状态
8.2.3 在 F# 使用闭包捕获状态 在这一节,我们要讨论闭包(closures),在函数编程中,这是一个重要概念。闭包是很常见的,大部分时间它们都不使用可变状态。不过,出于实用的考虑,使用可变状态有时也是需要的,对于限制可变状态的范围,闭包给我们提供了一个极好的方法。 首先,让我们来看一段简单的 F# 代码片段,我们在第五章中看过的: > let create
2011-06-27 10:48:00 592
翻译 8.2.2 命令设计模式
8.2.2 命令设计模式 命令模式描述了一种在应用程序中表示动作的方法。相对于前一个的模式,它常把已知的行为(比如,列表的筛选)和缺少的部分(谓词)参数化,而命令模式经常存储一些“工作单元”,能够在以后调用。我们经常看到,指定处理或操作步骤的命令集合,用户可以选择。看一下图8.2,你会认识到,一个接口看起来像一个可以用单独函数替换的很好的候选。图8.2 Invoker 存储
2011-06-22 14:36:00 603
翻译 8.2.1 策略设计模式
8.2.1 策略设计模式 在运行时,如果应用程序需要在几种算法之间,或一种算法的几个部分之间进行选择的话,策略模式是非常有用的。一种常见的情况是,当我们的应用程序需要执行的几个任务,只在较小的子任务上是不同的。使用策略模式,对于任务的公用部分,我们可以只写一次,加上参数化,把子任务(原操作)作为参数值。图 8.1 显示了策略模式的面向对象的表示。 图 8.1 Strat
2011-06-22 09:18:00 484
翻译 8.2 用于处理函数的习惯用语
8.2 用于处理函数的习惯用语 在前一章中,我们讨论了数据结构和相关的设计模式,看到结构模式的两个的示例,与设计函数式数据结构的问题相关,我们探索了行为模式,它描述了对象如何进行通信,在函数术语中,它对应于函数如何彼此调用。 在本章中,我们将讨论面向行为的应用程序,因此,很自然地,相关的模式将是行为模式。第一个被称为策略模式。
2011-06-21 14:57:00 365
翻译 8.1.4 在 F# 中使用函数列表
8.1.4 在 F# 中使用函数列表 首先,我们声明一个表示有关客户信息的类型。客户端有相当多属性,所以,最自然的表示将是 F# 的记录类型,我们在前一章中已经看过。清单 8.4 显示了这个类型声明,和所创建的示例客户的代码。 Listing 8.4 Client record type and sample value (F# Interactive) > typ
2011-06-21 14:46:00 516
翻译 8.1.3 在 C# 中使用函数集合
8.1.3 在 C# 中使用函数集合 考虑户贷款端时,我们想要执行所有测试,并统计返回 true 的测试数(指高风险)。如果数量为零个或一,程序将建议贷款。正常的命令式解决方案是,声明一个变量,使用 foreach 语句枚举测试。在循环中体,执行测试,如果它返回 true,就增加变量。这可以更优雅地实现,通过使用 LINQ 扩展方法 Count (清单 8.3)。 List
2011-06-21 09:02:00 490
翻译 8.1.2 在 C# 中把行为表示成函数
8.1.2 在 C# 中把行为表示成函数 我们前面提到过,以面向对象的方式理解函数,就是把它认为是有一个单独方法的接口。如果我们看一下清单 8.1 的代码,可以看到 IClientTest 就是这样声明的。这意味着,这个测试可以很容易地表示成一个简单的函数。在 C# 中,我们可以使用 lambda 函数来写测试: Func isRiskyYearsInJob = c
2011-06-20 16:52:00 526
翻译 7.6 第七章小节
7.6 第七章小节 如何以与我们想要使用的数据匹配的方式,处理数据和设计数据结构,是函数式程序设计的一个重要部分。在这一章,通过讨论 F# 记录类型,我们完成了基本的函数式数据类型的工具集。我们使用记录、列表,和递归的差别联合,一起来设计和实现用于处理文档的应用程序。 函数式编程在处理数据过程中,经常使用多种表示方法,我们的应用程序提供了这样一个示例。一种表示形式(元素的
2011-06-19 18:16:00 552
翻译 7.5.2 使用访问者模式添加函数
7.5.2 使用访问者模式添加函数 在已有的数据结构上添加新的操作,是函数语言中实现处理数据的任何代码的主要方式。在面向对象的语言,很难做到,也很少需要。在这一节,为此目的,我们将讨访问者模式,将草绘如何,使用它在我们的文档表示中添加操作。图 7.8 显示的是我们在这一节要用到的基类。 图 7.8 表示文档的类层次,和泛型访问者类,状态作为泛型类型参数 (T);由于 A
2011-06-17 17:27:00 519
翻译 7.5.1 用结构模式表示数据
7.5.1 用结构模式表示数据 如果我们讨论程序,是根据数据结构,而不是对象的话,我们可以说,结构模式是描述设计数据结构常见和行之有效的方法。设计模式是更为具体,并指定如何使用面向对象语言的对象来实现这些结构。在本章中,我们会看到,用函数式方法来表示数据。在第一种表示中,我们使用简单的记录列表,用任何一种语言来写都很容易,但是,第二种表示(使用差别联合)更有趣。我们来看一下第一
2011-06-17 14:51:00 567
翻译 7.5 面向对象的表示
7.5 面向对象的表示 标准的设计模式可以分为三组:创建、结构和行为。在这一节中,我们将看几个来自后两组的模式,它们类似于在本章前面使用的 F# 中的结构。模式的函数式版本不同于面向对象,因为,面向对象模式更强调添加新类型,而函数模式更强调添加新的函数,但结构会非常相似。 提示 本节假定你知道一点关于设计模式的内容。你可以在本书的网站上找到介绍性文章的链接,
2011-06-17 09:25:00 447
翻译 7.4.2 使用聚合操作进行计算
7.4.2 使用聚合操作进行计算 聚合背后的概念在于我们保持一些状态,将在整个操作过程中传递。我们用一个初始状态开始,用给定的处理函数,为文档中的每个部件,计算一个新的状态。这种概念被反映在函数的签名中: val aggregateDocument : ('a -> DocumentPart -> 'a) -> 'a -> DocumentPart –> 'a
2011-06-16 17:06:00 479
翻译 7.4 写操作
7.4 写操作 可能有多种操作我们来处理文档。我们可以使文档中的所有标题大写,或者,把多列文本合并到一个列。所有这些操作有一些共同之处,你可能会看到它们与前一章中的映射操作之间的相似性。就像映射一样,这些操作的每个都对文档进行检查,对特定部件执行一些转换,并返回一个新的文档。 另一种操作可能只返回一个不同类型的值。我们可以实现一个函数,统计文档中的字数,或将文档的全部文本
2011-06-14 17:24:00 433
翻译 7.3.2 用 XML 表示文档
7.3.2 用 XML 表示文档 XML 格式非常流行,完美地适合于存储分层数据,比如,我们上一节中的文档。处理 XML,对于许多现实世界的应用程序,是重要的。因此,在这一节中,我们将扩展应用程序,以支持从 XML 文件中加载文档。我们将使用 .NET 3.5 的 LINQ to XML API 来做大部分的困难工作——编写另外的 XML 解析器也没有任何意义。LINQ to XM
2011-06-14 14:44:00 582
翻译 7.3.1 转换表示
7.3.1 转换表示 我们实现数的据类型之间,存在两个关键的区别: 1、在新的表示形式中,文件是单个(递归)值,而在每种情况下,它是元素的列表。 2、第 7.2 节的数据类型显式包含边框,指定内容的位置。 3、第二个数据类型,只表示这部分是如何嵌套的。 这意味着当,当我们转换这种表示形式时,需要计算每个基于嵌套部分的位置。
2011-06-13 14:51:00 508
翻译 7.3 结构化文档表示
7.3 结构化文档表示 我们将在这一节设计的数据结构从 HTML 格式获得灵感,这是大家熟悉的,并成功创建文档的语言。就像 HTML,我们的表示有几种类型的内容,并且可能以适当的方法嵌套某些部分。图 7.3 显示了带注释的示例文档,它可以给你一个概念,格式包括哪些内容。 有两种不同的部分。简单的部分,如 TextPart 和 ImagePart,包含内容,但是不能包含嵌套
2011-06-06 18:28:00 624
翻译 7.2.2 在窗体上显示绘图
7.2.2 在窗体上显示绘图 绘图类似于第 4 章的示例。因为绘图需要一定的时间,我们将创建内存位图,在那儿绘制文档,然后,在窗体上显示位图,,而不是每次窗体失效时都绘制这个文档。让我们先看一下一个非常有用的函数式编程模式,我们将在这一节中使用。 "中间有洞"模式 写代码时的一个常见情形,是执行一些初始化,然后,是函数的核心部分,最后,是一些清理工作。当你在
2011-06-03 16:54:00 608
翻译 7.2.1 制图原理
7.2.1 制图原理 就像在第 4 章中,当我们画饼图时,我们将使用标准 .NET 的 System.Drawin 库。此示例的点是演示使用以前表示,绘图是极其简单,所以,在清单 7.6 的核心函数只有几行代码。它遍历列表中的所有元素,包含绘制的代码在两个不同的元素。 Listing 7.6 Drawing document using flat representatio
2011-06-02 08:59:00 1229
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人