自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 资源 (7)
  • 收藏
  • 关注

翻译 第八章 以行为为中心的程序设计

第八章 以行为为中心的程序设计 本章介绍■ 用函数表示行为■ 扩展程序行为■ 处理函数和闭包■ 用决策树测试客户端在第七章,我们讨论了以数据中心的应用程序,知道了,设计函数式程序的第一步是定义相关的数据结构。还有一种情况,数据结构中包含了某种形式的行为,既可能是用户调用的命令,也可能是程序在某一点执行的任务。对这种情况,我们想统一处理,而不是为每一种行为的功能进行硬编码,因此,在数据结构的设计上,

2014-11-28 17:15:41 820

翻译 7.5.1.2 装饰设计模式(THE DECORATOR DESIGN PATTERN)

7.5.1.2 装饰设计模式(THE DECORATOR DESIGN PATTERN) 与复合模式相似的是装饰模式(decoratorpattern),这种模式的目标是,在运行时能够为已有的类添加新的行为。图 7.7 中可以看到,结构非常类似于复合模式。这两个模式看起来相似,但目的完全不同的。复合模式的目的是把组合值与基本值同等对待,而装饰模式是为已有对象添加新的功能。从图 7.7

2014-11-28 09:43:03 946

翻译 7.5.1.1复合设计模式(THE COMPOSITE DESIGN PATTERN)

7.5.1.1复合设计模式(THE COMPOSITE DESIGN PATTERN) 复合模式可以把几个对象组合成一个复合对象,使用这种的方法与使用基本对象一样。图 7.6 显示了面向对象实现这种模式的通常方法。图 7.6CompositeComponent 是包含其他组件集合的类;它继承自 AbstractComponent,因此,能够使用基本组件的地方,也一样可以使用

2014-11-27 16:52:07 1862

转载 FSharp.Data.SqlClient: Seamlessly integrating T-SQL and F# in the same code

http://blogs.msdn.com/b/fsharpteam/archive/2014/05/23/fsharp-data-sqlclient-seamlessly-integrating-sql-and-f-in-the-same-code-base-guest-post.aspxFSharp.Data.SqlClient: Seamlessly integrat

2014-11-27 15:17:48 1223

翻译 7.5.1 用结构模式表示数据

7.5.1 用结构模式表示数据 如果我们根据数据结构,而不是对象来讨论程序的话,我们可以说,结构模式是描述设计数据结构常见和行之有效的方法;设计模式是更为具体,说明了如何在面向对象语言中,使用对象实现这些结构。在本章,我们会看到用函数式表示数据的方法。第一种表示方法,我们使用简单的记录列表,用任何一种语言来写都很容易,而第二种表示方法(使用差别联合)更有意义。我们先看一下第一种模式,复合模

2014-11-27 14:57:36 774

转载 Announcing a preview of F# 4.0 and the Visual F# Tools in VS 2015

http://blogs.msdn.com/b/fsharpteam/archive/2014/11/12/announcing-a-preview-of-f-4-0-and-the-visual-f-tools-in-vs-2015.aspxAnnouncing a preview of F# 4.0 and the Visual F# Tools in VS 2015

2014-11-27 14:49:29 773

翻译 7.5 面向对象的表示方法

7.5 面向对象的表示方法 标准的设计模式可以分为三组:创建、结构和行为(creational, structural, and behavioral)。在这一节,我们将讨论后两组中的几种模式,它们类似于在本章前面用F# 使用的结构。模式的函数式版本不同于面向对象,因为面向对象编程把重点放在添加新类型,而函数编程的重点放在添加新函数,但结构非常相似。 提示 本节假定你有一点

2014-11-27 11:17:32 1503

翻译 7.4.2 使用聚合操作进行计算

7.4.2 使用聚合操作进行计算 聚合背后的思想是,在整个操作过程中,传递的某些状态能够被保持。我们首先初始状态,用给定的处理函数,为文档中的每个部分,计算出一个新的状态。这种思想反映在函数的签名中: val aggregateDocument :  ('a -> DocumentPart -> 'a)-> 'a -> DocumentPart –> 'a 我们之所以使

2014-11-27 11:07:06 914

翻译 7.4.1 用映射操作进行更新

7.4.1 用映射操作进行更新 尽管这个操作类似于映射,但是,真的实现,还需要作出重要的设计选择。分栏部分可能递归地包含多个部分,所以,文档是一种树形结构,我们需要决定以哪种顺序处理节点:1、从根部开始,对所有嵌套在其中的部分,递归地调用映射操作。2、从叶子开始,首先处理嵌套最深的部分,然后,返回到包含它们的部分。在处理列表时,顺序无关紧要,但是,对于树形结构,却是相当重要的。

2014-11-27 09:32:25 911

翻译 7.4 写操作

7.4 写操作 处理文档,可能有多种操作;我们可以把文档中的所有标题改成大写,或者,把多列文本合并到一个列。可以发现,所有这些操作有一些共同之处,它们与前一章的映射操作之间有相似性;如同映射一样,每个操作都对文档进行检查,再对特定部分执行某种转换,最后,返回新的文档。另一种操作可能只返回一个不同类型的值,比如,可以实现这样的函数,统计文档中的字数,或将文档的全部文本作为字符串都返回。这

2014-11-26 14:57:19 629

翻译 7.3.2 用 XML 表示文档

7.3.2 用 XML 表示文档 XML 格式非常流行,非常适合于保存分层次的数据,比如,上一节的文档。如何处理 XML,对于许多实际应用非常重要,因此,在这一节,我们要扩展我们的应用程序,以支持从 XML 文件加载文档。我们将使用.NET 3.5 的 LINQ to XMLAPI 完成大部分的困难工作,自己再写另外的 XML 解析器没有任何意义。LINQto XML 是函数概念应用于主流

2014-11-26 10:58:24 964

翻译 7.3.1 转换表示

7.3.1 转换表示 在我们实现数的据类型之间,存在两个关键的不同:[两个不同,怎么出现三项]1、在新的表示形式中,文件是一个(递归)值,而在第一种情况下,是元素的列表。2、第 7.2 节的数据类型显式包含边框,指定内容的位置。3、第二个数据类型,只表示各部分是如何嵌套的。因此,当我们进行表示形式的转换时,需要计算每个嵌套部分的位置。这些差异影响转换函数的签名,在我

2014-11-25 17:34:14 827

翻译 7.3 表示结构化文档

7.3 表示结构化文档 在这一节我们所设计的数据结构,灵感来自 HTML 格式,这是我们熟悉的,成功创建文档的语言。就像 HTML 一样,我们表示的内容有几种类型,并且有些部分可能以适当的方法嵌套。图 7.3 显示了带注释的示例文档,它能给你格式包括哪些内容的概念。有两种不同的部分。简单的部分,如 TextPart 和 ImagePart,包含内容,但不包含嵌套的部分;在另一侧,Tit

2014-11-25 15:23:13 1249

翻译 7.2.2 在窗体上显示绘图

7.2.2 在窗体上显示绘图绘图与第四章的示例类似。因为绘图需要一定的时间,我们将在内存中创建位图,绘制好文档,然后,在窗体上显示位图,而不是每次窗体失效时都绘制文档。我们先看一下非常有用的函数式编程模式,这一节就将使用。“Hole in the Middle(中间有洞)”模式[真心不知道,Hole in the Middle 是什么意思?]写代码的一个常见

2014-11-25 10:08:56 1049

翻译 7.2.1 绘制元素

7.2.1 绘制元素如同在第四章画饼图时那样,我们将使用标准 .NET 的 System.Drawin 库。这个示例演示使用前一节的表示方法,绘图极其简单,清单 7.6 中的函数核心只有几行代码,遍历列表中的所有元素,包含了绘制两种不同元素的代码。清单 7.6 绘制使用平面表示的文档 (F# Interactive)> let drawElements elem

2014-11-24 16:13:10 838

翻译 7.2 平面文档的表示

7.2 平面文档的表示 在这一章,我们将要开发一个用于显示文档的应用程序。首先设计文档的表示形式,适合于绘制在屏幕上。使用这种表示方式,文档就是元素的列表,其中包含一定内容(可以是文本,也可以是图像),和指定的边框,在边框中绘制具体内容。图7.1是一个文档的示例,有三个突出显示的元素。我们看一下用 F# 表示文档的数据结构。清单 7.4 引入了新的表示两种类型元素的差别联合,和新的表示

2014-11-24 15:41:34 951

翻译 7.1.2 C# 中的函数式数据结构

7.1.2 C# 中的函数式数据结构 我们曾经用 C# 实现过几个函数式不可变数据类型,比如 FuncList 或元组。在 C# 中,是通过以特殊方式写类来实现的,最重要的是,所有属性必须是不可变的,这是通过使用只读字段,或者通过声明的属性具有私有的 setter,且只在类的构造函数中设置来实现。在清单 7.3 中,我们使用第一种方法实现似于类清单 7.1 中 Rect 类型的类。 

2014-11-24 11:09:12 841

翻译 7.1.1.1 处理记录

7.1.1.1 处理记录 我们在本章后面还要用到Rect 类型,有两个简单的函数来处理矩形。第一个函数是缩小矩形,通过从每一条边上减去指定的宽度和高度,第二个函数是把我们的矩形表示形式转换成 System.Drawing 命名空间中的 RectangleF 类。清单 7.2 中是这两个函数。 清单 7.2 处理矩形的函数 (F# Interactive) > open Sy

2014-11-24 09:58:27 908

翻译 7.1.1 使用 F# 记录类型

7.1.1 使用 F# 记录类型 记录是“有标记元组(labeledtuples)”,是把几个不同的元素保存在一个值中;此外,每个元素都有一个可以用来访问的名字。在 F# 中,元素的名字叫字段(fields),它在很多方面类似于 C 的记录或结构(struct)构造,或者 C# 中的匿名类型。记录与匿名类型既有不同,即必须事先声明,也有相同,在基本形式中,记录只包含唯一属性,保存数据;清单

2014-11-24 09:38:56 1034

原创 电子邮件地址的正则表达式

电子邮件地址的正则表达式^[a-zA-Z0-9._%+-]+@(?!.*\.\..*)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$

2014-11-23 14:14:00 11190 1

翻译 7.1 函数式数据结构

7.1 函数式数据结构 用函数编程,程序处理的数据总是保存在数据结构中。数据结构和对象之间的区别在于,数据结构公开了表示数据(从名字就可以知道) 的结构;知道了数据的结构便于写处理的代码,但要到第九章才讨论,F# 还提供了一种封装结构的方法,如同面向对象编程,当我们想从库中导出 F# 数据结构,或者用于 C#。正如我们在第二章讨论函数概念时所说的,这些数据结构是不可变的。在这一章,我们

2014-11-21 15:41:43 1375

翻译 第七章 以数据为中心的程序设计

第七章 以数据为中心的程序设计 本章介绍■ 表示和处理文档■ 设计不可变数据结构■ 数据表示形式之间的转换■ 使用记录和递归差别联合 在设计函数式程序时,首先要考虑的是程序处理的数据;由于重要的程序都使用数据,因此,在应用程序设计中,这个方面极为重要。用函数语言实现程序,我们也是从设计在代码中用到的数据结构开始;下一步才会写处理数据的运算。但是不同于面向对象的设

2014-11-21 11:04:31 1536

翻译 6.9 第六章小结

6.9 第六章小结 这一章,连同第五章一起,我们讨论了函数值。正如在前一章看到的,值对于控制程序流,非常重要,能够以函数方式写代码,函数的参数是值,返回的结果也是值,[因此,函数可以]组合起来。在这一章,我们看到处理值的更简便方法,不直接使用值的结构,而是使用一组在 F# 库中定义的高阶函数值。我们已经知道它们是如何实现的,我们也可以为自己的类型,实现类似的功能。特别是,我们还讨论了能

2014-11-20 15:06:36 668

翻译 6.8.2 列表的绑定操作

6.8.2 列表的绑定操作 我们只讨论了选项值的绑定(bind)操作,实际上,它是非常重要的函数式操作,我们将在第十二章介绍。清单 6.26 显示了对选项值绑定操作的类型签名,以及如果我们定义列表的绑定操作,它的类型签名。 清单 6.26 绑定操作的签名 (F#)Option.bind : ('a -> 'b option) -> 'aoption -> 'b option

2014-11-20 14:31:18 1003

翻译 6.8.1 映射、筛选和折叠(Mapping, filtering, and folding)

6.8.1 映射、筛选和折叠(Mapping,filtering, and folding) 映射、筛选和折叠是函数编程中最常见的操作;在处理函数式列表时,我们已经用到过,但它们还支持所有其他的集合类型(我们将在第十和十二章讨论其中一部分);这些操作并不限于集合,所有的操作都可用于处理选项类型。清单 6.25 显示了映射、筛选和折叠函数的签名类型,清单中包括了我们尚未讨论过的Optio

2014-11-20 10:30:12 886

翻译 6.8 通用处理语言

6.8 通用处理语言 在这一章,我们已经看到几种递归模式,比如映射的操作,对于选项值和列表都可用;还可以用于处理元组,我们实现了 mapFirst 和 mapSecond 函数。许多不同的值共享一组相似的处理函数,因此,把这些操作当作是一种通用语言是意义的。但是,操作的名称可能因值而不同:类型签名中的相似性往往要比名称的相似性更重要。

2014-11-19 16:33:00 766

翻译 6.7.3.1 在 C# 中实现 fold

6.7.3.1 在 C# 中实现 fold与 fold 有相同行为的操作,在 .NET 库中也有,但是,名字叫Aggregate(聚合)。通常,它是能够在任何集合类型上运行的扩展方法,我们也可以像 F# 函数一样使用它。清单 6.21 是我们用 C# 3.0 重写前面示例的代码。在 F# 中,我们用元组来保存在聚合过程中的状态。你也许还记得以前的几章中,我们曾提到过,C# 3.0 中的

2014-11-19 15:46:12 1161

翻译 6.7.3 实现列表函数

6.7.3 实现列表函数 刚才我们看到的筛选和映射函数,没有展示如何实现,现在,我们要看一个在第三章开始创建的函数。因为所有的列表处理函数都有类似的结构,看过下面的示例以后,实现其他任何函数也是可能的。在第三章,我们写的函数,能够计算列表中的所有元素的和或积;随后,我们就意识到它可能比开始所表现的更有用:我们看到,它还能用来查找最小或最大元素。那时,我们没有讨论过泛型,因此,函数只处理

2014-11-19 14:42:06 808

翻译 6.7.2.1 处理列表

6.7.2.1 处理列表 我们看一个有关使用筛选和映射更大的示例,在 F# 库中的两个函数适用于各种集合类型,但我们将只用它来处理我们已经很熟悉的列表;在 C# 中,这些方法可用于任何实现了 IEnumerable 接口的集合,所以,我们将使用泛型 .NET List 类。清单 6.21 显示了我们将要处理数据的初始化。 清单 6.21 有关城市人口的数据 (C# and F#)

2014-11-19 11:02:48 871

翻译 6.7.2 理解列表函数的类型签名

6.7.2 理解列表函数的类型签名 前面提到过,我们使用函数来筛选和映射列表,都很直观。在本节,我们将看到它们的类型签名,知道只通过此信息,就可以推断出高阶函数能做什么。当然,在一般情况下,不能从函数的类型就知道它能做什么,但对于泛型和高阶函数,例如那些用来处理列表的函数,通常是可能的。如我们前面所见的,处理泛型值的函数所做的不如单独处理值,因为,不能知道值的所有消息,因此,它们通常要

2014-11-18 15:43:59 1355

翻译 6.7.1 用F# 实现列表

6.7.1 用F# 实现列表 虽然我们已经使用过 F# 中的列表,还用 C# 实现了相同的功能,但还没有研究如何用F# 实现列表类型。当我们前面讨论列表时,看到列表既可以表示为空值(nil)(空列表),也可以表示包含元素和引用列表其余部分的 cons cell。现在,如果我们回顾上一章中有关值的内容,这就像是有两个选项的可选值;微有一点稍不同,列表类型是递归的,因此,cons cell

2014-11-18 14:48:45 922

翻译 6.7 处理列表

6.7 处理列表 在第三章,我们讨论过列表,学习了显式使用递归和模式匹配处理列表,还用 C# 实现了函数式列表类型;第 4 章的示例应用程序就以这种方式使用列表,但是要注意,显式写列表处理并不实用。在这一章,将用到递归模式,因此,你可能已经知道我们下一步要讨论什么了。我们可以使用高阶函数来处理列表,而不必显式使用模式匹配的每种情况;我们已经看到过一些处理 F# 列表的函数,比如 Lis

2014-11-18 14:09:06 751

翻译 6.6.2 自动泛型化(automatic generalization)

6.6.2 自动泛型化(automatic generalization) 在这一章,我们已经实现了几个 F# 的高阶函数,也看到了在 F# 和 C# 中并排的实现。F# 实现的很重要方面,是我们根本不需要指定类型;这是由于有了自动泛型化(automatic generalization),它用在推断函数声明的类型。我们将用Option.bind 函数的实现作为示例,介绍这个过程是如何工作

2014-11-18 11:20:06 889

翻译 6.6.1 F# 中函数调用的类型推断

6.6.1 F# 中函数调用的类型推断 虽然,在 F# 中可以用尖括号指定类型参数值,与 C# 中的方式相同,但这种方法很少使用。原因是,当编译器无法推断出所有的信息,需要程序员的帮助时,我们仅在真正需要的地方,添加类型批注。我们用一个示例来演示: > Option.map (fun dt -> dt.Year)(Some(DateTime.Now));;error FS007

2014-11-18 10:23:21 1093

翻译 6.6 类型推断

6.6 类型推断 我们曾经讨论过值的类型推断,知道在 C# 3.0 中用 var 关键字,在 F#中用 let 绑定。从本节开始,我们将讨论由 C# 和 F# 共有的另一个方面,当在 C# 中调用泛型方法时,如 Option.Some(清单 5.9)或 Option.Map(清单 6.13),可以显式指定类型参数值,像这样: var dt = Option.Some(DateTim

2014-11-16 11:42:15 1014

翻译 6.5.2 C# 中的函数组合

6.5.2 C# 中的函数组合 C# 中的函数组合是可能的,但使用非常有限,这是部分是由于在 C# 中散应用不能很容易使用,但更重要的是,因为大多数操作是用成员来写的,而不是函数。但我们至少可以用 C# 演示同样的想法,清单 6.18 显示了 Compose 方法的实现,以及使用的示例。 清单 6.18实现并使用 Compose 方法 (C#)static Func Compo

2014-11-16 09:27:30 1381

翻译 6.5.1 函数组合

6.5.1 函数组合 处理函数最重要的操作,就是组合。先看一个示例是非常有用的,这个示例用元组保存(城市的)名字和人口。在清单 6.16 中,我们创建一个函数,根据人口的规模,确定是城市、镇,还是村;同时用保存在列表中的几个地方测试确定状态。 清单 6.16 处理城市信息 (F# Interactive)> let places = [("Grantchester", 552)

2014-11-11 18:48:15 1105

翻译 6.5 使用函数

6.5 使用函数 目前为止,我们在这一章中讨论到的所有高阶函数都有类似结构,有两个参数:一个是要处理的值,另一个是指定如何处理这个值的函数。在使用函数时,值参数也可以是函数,因此,高阶函数的两个参数都可以是函数。

2014-11-11 16:23:37 710

翻译 6.4.4.1 在 C#中使用选项类型

6.4.41 在 C#中使用选项类型 扩展方法能够以流畅的方式来编写使用绑定和映射的代码。由于括号中的数字可能会造成混乱,因此要注意,调用 Map 是嵌套在 lambda 函数中的,作为 Bind 的参数值: Option ReadAndAdd() {  returnReadInput().Bind(n =>    ReadInput().Map(m=> m + n));

2014-11-03 10:58:33 965

翻译 6.4.4 实现选项类型的操作

6.4.4 实现选项类型的操作 绑定(bind)和映射(map)的实现有类似的结构,因为,两者都是依据选项值进行模式匹配的高阶函数。我们来看一看 F# 和 C# 的实现,这是在 C# 中实现函数式概念的最好示例。我们先看一下清单 6.14,这是映射操作的实现。 清单 6.14 用 F# 和 C# 实现 map 操作F# InteractiveC#

2014-11-02 21:24:16 625

SQL.Server.2012.Integration.Services-2

SQL.Server.2012.Integration.Services

2012-04-20

SQL.Server.2012.Integration.Services

SQL.Server.2012.Integration.Services

2012-04-20

SQL.Server.2012.Administration-2

SQL.Server.2012.Administration

2012-04-20

SQL.Server.2012.Administration

SQL.Server.2012.Administration

2012-04-20

jQuery.1.4.Reference.Guide

jQuery.1.4.Reference.Guide

2010-02-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除