自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

翻译 14.1 理解不同的并行技术

14.1 理解不同的并行技术    在这一节中,我们会讨论三种技术,并使用简单的示例来演示。我们将使用 .NET 的并行扩展(Parallel Extensions to .NET),这是一个并行编程库。它是 .NET Framework 4.0 标准的一部分,但是,不幸的是,在早期 .NET 的版本中是不可用的。如果要使用 Visual Studio 2008,体验并行扩展,你可

2011-11-30 22:02:25 1048

翻译 14 第十四章 写并行函数式程序

14 第十四章 写并行函数式程序本章介绍■ 用不可变数据简化并行化(parallelization)■ 处理任务并行库(Task Parallel library)■ 用 LINQ 以声明方式表达并行度(parallelism)■ 实现重载(overloaded)运算符    我们已经看到,许多赞成函数式编程的论据。原因之一就是,并行

2011-11-29 19:30:36 779

翻译 13.6 第十三章小结

13.6 第十三章小结    这一章的重点是要演示了在 F# 中,典型的探究式编程(explorative programming)的生命周期。我们还介绍了一些 F# 语言和库功能,在其他的发展进程中非常重要。    我们首先从网络获取数据。为此,我们使用异步工作流,在标准的 F# 库中实现 F# 计算表达式。异步工作流可用于高效实现 I/O 和其他非常耗时的操作,而不会阻

2011-11-27 11:17:48 641

翻译 13.5.2 用 Excel 的图表显示数据

13.5.2 用 Excel 的图表显示数据    若要创建一个图表,我们需要指定很多属性。幸运的是,Excel 的 API 提供了 ChartWizard 方法,使它更容易。这个方法取所有重要的图表属性作为可选参数,这样,可以只指定那些需要的属性。F# 语言支持可选参数,因此,清单 13.20 中的代码,创建图表非常简单。Listing 13.20 Generat

2011-11-26 14:32:48 910

翻译 13.5.1 将数据写到 Excel

13.5.1 将数据写到 Excel    Excel 的互操作都是标准的 。NET 程序集,我们可以在 F# Interactive 为使用 #r 指令,来引用。一旦我们这样做了,就可以使用类,运行 Excel 作为独立(可见的或不可见的)的应用程序,以及写脚本。清单 13.18 显示如何启动 Excel,创建一个新工作簿,有一个工作表,并在这个工作表中写入数据。

2011-11-25 20:45:41 887

翻译 13.5 使用 Excel 可视化数据

13.5 使用 Excel 可视化数据     F# 为我们提供几乎无限数量的可视化数据的方法。我们可以使用标准的 .NET 库,比如 Windows Forms 或 WPF,也可以自己创建可视化,使用 DirectX 实现复杂的可视化,或者,使用许多现有的支持 .NET 的库中的某一个。在本章中,我们将使用稍许不同的方法,使用 Excel 表现数据。正如你将看到的,这是比较容易做到的,因

2011-11-25 16:40:08 1336

翻译 13.4.3 收集有关地区的统计信息

13.4.3 收集有关地区的统计信息     我们的目标是,自 1990 年以来不同地区森林面积的变化。我们需要遍历所有地区,测试数据是否可用,并找到下载的指标值。这可以使用创建的映射非常轻松地完成,因为有年份和地区 ID 作为键值。    我们必须小心,因为一些数据可能会省略,所以,我们要过滤掉没有数据我们感兴趣的所有年份的任何地区。还想要显示森林的总面积,而不是百分比,所以,在返回

2011-11-25 15:12:44 554

翻译 13.4.2 用度量单位格式化数据

13.4.2 用度量单位格式化数据     当从 XML 数据读许多指标值的,我们只能将它们转换为浮点(float)值。那是可行的,因为面积和森林覆盖率都是数字,但是,它不能告诉我们数据的更多内容。将数据从非类型化的 XML 转换为 F# 类型化数据结构的目的是,用类型进行注释,有帮于了解这些值的含义。为了使类型更具体,我们可以使用在第 2 章中提到的度量单位。使用这个功能,可以指定面积以

2011-11-25 14:06:20 899

翻译 13.4.1 读取值

13.4.1 读取值    我们要做的第一件事,是从 XML 中读取我们感兴趣的数据。我们要写一个函数,取一个 XDocument 对象的列表(用于数据集的每个页面),并返回一个序列,每个元素包含指示器、 地区名,年,其中的值被测量。    清单 13.14 显示,以 readValues 函数的形式,以及辅助函数,从表示一条记录的 XML 节点读数据。每个函数有一个参数,

2011-11-24 21:23:21 492

翻译 13.4 从数据收集信息

13.4 从数据收集信息    我们可以从互联网下载的数据量非常大,但j是,困难的部分是从中收集有用的信息。到目前为止,在本章中,我们已经下载地区列表,并把它转换为包含每个地区名字的序列。然后,我们下载一组包含所有地区和国家信息的 XML 文档。在本节中,我们将这些非类型化的 XML 数据转换为类型化的数据结构,包含的信息可以方便地显示给用户。

2011-11-24 19:48:17 499

翻译 13.3.3 获取各项指标

13.3.3 获取各项指标    若要获取有关国家或地区的数据,需要使用世界银行服务的不同函数。函数的路径是 /countries/indicators(/国家/指标),可以在 Data Calls 选项卡下的 Query Generator(查询生成器)中找到。能够请求指定国家特定时间段内的有关指标数据。不是单独下载我们感兴趣的数据每个区域,而是一次获取所有国家的信息,并在内存中

2011-11-24 19:30:14 713

翻译 13.3.2 提取区域的代码

13.3.2 提取区域的代码    我们下载函数的结果是一个字符串,所以,需要将字符串作解析为 XML 文档。我们将频繁需要这个操作,所以,要写一个简单的打包函数,使用 worldBankDownload 下载数据,返回结果为 XDocument 对象。下载执行异步,因此,要使用异步工作流实现这个函数:let worldBankRequest(props) = as

2011-11-23 22:29:27 657

翻译 13.3.1 实现 XML 辅助函数

13.3.1 实现 XML 辅助函数     LINQ to XML 主要用于 C# 和 VB,在 F# 中使用可能有些麻烦。例如,F# 不支持隐式类型转换(因为这会使类型推断复杂),所以,每次我们指定元素名,必须使用 XName.Get,而不是只使用一个字符串。或者,我们可以写一个简单的工具函数或自定义运算符,来完成这些。    我们可以很容易地实现几个 F# 函数,把 LINQ t

2011-11-23 15:03:17 633

翻译 13.3 探索并获取数据

13.3 探索并获取数据       就像我们在最后的几个例子中所看到的,世界银行数据服务返回数据是 XML 文档,这样,我们可以写任何代码,以有意义的方式处理数据之前,需要将它转换为 F# 类型。在第 7 章,我们在XML 和我们自己自定义的差别联合类型之间进行过转换,但在这里,我们要使用的是元组和序列。这是因为,这样的数据结构很简单,当我们交互式处理数据时,需要频繁地修改代码,既要调整

2011-11-23 09:10:00 628

翻译 13.2.2 从故障中恢复

13.2.2 从故障中恢复    世界银行服务对每个用户密钥每一天请求数量有限制,也限制了请求的频率。这意味着,如果我们一次运行大量的请求,有些可能会返回错误。解决方法是捕获异常,稍后重试请求。    清单 13.7 实现一个循环,重复执行的请求,直到成功,或者尝试 20 次。使用异常报告失败, 使用 F# 的 try … with 结构捕捉异常。Listi

2011-11-22 19:13:00 723

翻译 13.2.1 访问世界银行的数据

13.2.1 访问世界银行的数据     我们在本章中使用的数据源,是由世界银行提供的服务,它是为发展中国家提供资金和知识的国际组织。作为其工作的一部分,该组织需要确定对评估发展中国家,哪种类型的支持最有效,确定需求在哪里,以及对经济、生活质量、环境是否产生了影响。世界银行有一组数据,称为世界发展指标(World Development Indicators),它包含了许多国家的信息,而且

2011-11-22 15:07:42 979

翻译 13.2 连接到世界银行

13.2 连接到世界银行     我们在一章讨论有关探索式编程(explorative programming),放在异步工作流上,这决不是偶然的。我们今天要处理的很多有趣的数据源,都是以 web 服务的形式,或者是其他基于 web 的应用程序,在线可用。如我们所见,异步工作流是 F# 获取数据的本质特征。    高效地下载数据并不是我们唯一的问题。数据源返回的数据通常是非类型化的格式

2011-11-22 11:15:27 568

翻译 13.1.4 创建基元工作流

13.1.4 创建基元工作流    F# PowerPack 库包含许多重要的 I/O 操作异步版本,但是,它可不能包括所有。为此,F# 库还提供了构建自己的基元工作流的方法。如果要运行在工作流内部的操作,使用的标准 .NET 模式,并提供了 BeginOperation 和 EndOperation 方法,可以使用 Async.FromBeginEnd 方法。如果你把这两种方法给

2011-11-21 19:41:35 698

翻译 13.1.3 理解工作流的工作方式

13.1.3 理解工作流的工作方式    在前一章中,我们看到,用计算表达式写的 F# 代码被转换成一个表达式,它使用由适当计算生成器提供的基元。对于异步工作流,这意味着,let! 结构被转换成对 async.Bind 的调用,return 被转换成 async.Return。此外,异步工作流是延迟的。这意味着,计算本身要打包到一个额外的基元,确保整个代码括在一个函数中。这个函数在

2011-11-21 18:48:56 947

翻译 13.1.2 异步下载网页

13.1.2 异步下载网页     在我们使用异步工作流来获取网页内容之前,需要引用 FSharp.PowerPack.dll 库,它包含许多 .NET 方法的异步版本。当开发独立的应用程序时,可以使用添加引用命令。在这一章中,我们将使用互动开发模式,创建一个新的 F# 脚本文件,使用 #r 指令(清单  13.1)。 Listing 13.1 Writing code using

2011-11-21 11:26:47 744

翻译 13.1.1 异步工作流为什么重要?

13.1.1 异步工作流为什么重要?    假设我们要下载 web 页的内容,以便可以在我们的应用程序中使用。我们可以使用来自 System.Net 命名空间下的 WebClient 类,但是,不会演示当我们需要的问题,当我们运行复杂、长时间运行的操作时。相反,我们将首先显式创建 HTTP 请求,然后,下载数据:var req = HttpWebRequest.Create

2011-11-20 16:53:27 1055

翻译 13.1 异步工作流

13.1 异步工作流     有许多地方需要使用异步操作。当我们使用磁盘、调用 web 服务,或者连接到数据库时,异步工作流可能有显著的性能优势。当应用程序执行异步操作时,很难预测什么时修操作将完成。如果不能正确处理异步操作,应用程序就会效率低下,甚至可能停止响应。     写出能够执行异步操作,而不会阻止调用线程的代码,避免出现问题是必要的,但是,使用当前的技术很难实现。在 F# 中

2011-11-20 14:42:57 512

翻译 13 第十三章 异步和数据驱的编程

13 第十三章 异步和数据驱的编程本章介绍 ■ 异步工作流编程 ■ 使用 F# Interactive 浏览数据 ■ 使用度量单位定义类型 ■ 处理与可视化数据    我们首先引述了一次对比尔 · 盖茨的采访,他谈到,他有兴趣的编程任务的类型,并描述了编写应用程序的典型情况:    从 web 获取数据,不只是把它当作文本,而

2011-11-20 14:15:27 558

翻译 第四部分 函数式编程

第四部分 函数式编程    虽然函数式编程肯定是优雅的,但是,你可能更感兴趣的是其实用目的:作为一种通用的风格,是有用的,在某些问题域中,它肯定是出色的。我们已经看到的例子,比如,第 4 章中绘制饼图的应用程序,和第 11 章中简单的照片浏览器,这些示例的主要目的是,为了演示特定的概念和技术。    第四部分则不同。在每一章中,我们将花大量时间,讨论实际问题,使用最适当的

2011-11-19 19:25:15 413

翻译 12.8 第十二章小结

12.8 第十二章小结    在本章的第一部分,我们讨论了 .NET 序列,由 IEnumerable 类型表示,在 F# 中也称为 seq 。我们开始讨论生成序列的技术,包括高阶函数、迭代器和 F# 序列表达式。我们看到,序列是延迟的,能够创建无穷序列。我们看到了一个实际的示例,使用颜色的无穷的序列,将绘制图表的代码,从在图表中使用的生成颜色的代码中分离出来。    接下

2011-11-19 16:17:41 452

翻译 12.7.3 使用计算表达式进行重构

12.7.3 使用计算表达式进行重构    在前一章中,我们看到一些重构函数式程序的方法。最后一个主题是延迟性,它变改代码的执行方式,而不影响程序的结果。从某种意义上讲,添加延迟性也可看作是一种重构技术。计算表达式类似之处在于,它们增加其他方面的代码,而不改变其核心意义。提示    在计算表达式和延迟性之间有密切的关系,创建一个计算表达式,把代码转换

2011-11-19 15:34:00 570

翻译 12.7.2 创建日志记录计算

12.7.2 创建日志记录计算    清单 12.24 首先开始通过实现两个辅助函数,用于读取和写入控制台。两者还会把一条消息写入日志,所以,它们将括在 log 计算块中。为了显示如何组合非标准计算,我们在第三个函数中,使用了这两个函数。在我们前面的示例中,使用 let! 基元,但是,清单 12.24 还引入了 do!。Listing 12.24 Logging u

2011-11-19 14:29:23 501

翻译 12.7.1 创建日志记录的计算

12.7.1 创建日志记录的计算    这个计算将产生一个值,并能够将消息写入到本地日志记录的缓冲区。这意味着,计算的结果将是一个值,和包含这些消息的字符串列表。再次,我们还是使用有一个识别器的差别联合,表示这个类型:type Logging =   | Log of 'T * list    这个类型非常类似于我们先前讨论的 ValueWrap

2011-11-18 20:42:43 560

翻译 12.7 给计算增加日志记录

12.7 给计算增加日志记录    日志通常可以使用全局可变状态实现。然而,如果我们想要避免使用全局可变状态,并保持程序的纯函数性,又会如何呢?我们会有一个选择,就是把日志记录器的状态作为额外的参数值,传递我们要调用的每个函数。实现可能非常困难(想象一下,如果我们决定将另一个参数添加到这个状态中!)。    要解决这个问题,我们可以创建一个自定义计算类型,启用日志记录,隐藏

2011-11-18 18:25:30 634

翻译 12.6 实现选项的计算表达式

12.6 实现选项的计算表达式     在 12.4 节中,我们用选项值作为示例,介绍了用 LINQ 查询和 F# 的计算表达式创建非标准计算的概念。我们所写的代码处理选项值,有自定义的值绑定来读取实际值,就好像是一个标准值。我们已经看到如何转换计算表达式,知道我们的 Bind 成员会接收一个值,和一个 lambda 函数。我们只想执行这个 lambda 表达式,有我们的选项类型计

2011-11-18 16:25:41 661

翻译 12.5.4 在 C# 中实现查询运算符

12.5.4 在 C# 中实现查询运算符    当我们在清单 12.14 中,讨论序列和分析 SelectMany 操作时,已经看到如何把 C# 查询转换为方法调用。我们将只支持查询以 select 子句结尾,而忽视那些仅对集合有用的情况,比如分组。这意味着,我们就需要实现 Select 扩展方法。    我们前面说过,第二个和随后的 from 子句被转换成对 Select

2011-11-17 18:06:14 595

翻译 12.5.3 在 F# 中实现计算生成器

12.5.3 在 F# 中实现计算生成器     在计算表达式块前面的的标识符,是一个类的实例,它把所需的操作实现成为一个实例成员。许多操作都是可用的:我们不必要支持所有的。用 Bind 和 Return 成员实现最基本的操作。当 F# 编译器看到计算表达式时,就像清单 12.18 中的,它会将计算表达式转换为 F# 代码,使用这些成员。转换的 F# 示例如下所示: value.B

2011-11-17 16:49:32 743

翻译 12.5.2 写计算

12.5.2 写计算     C# 查询表达式和 F# 计算表达式,可以使用函数,以非标准方式的行为(通过返回一些一元值) ,就好像返回普通的值。我们在这一节中使用的计算类型是 ValueWrapper ,因此,原始函数将返回ValueWrapper 类型的值,而不只是 T。    实现这些函数,既可以使用另外的查询或计算表达式,也可以通过直接创建计算类型的值。有些计算表达式可以封装复

2011-11-17 11:39:58 534

翻译 12.5.1 声明计算类型

12.5.1 声明计算类型       在这个示例中的计算类型(在 Haskell 术语中的一元类型)称为 ValueWrapper,它只是存储泛型类型参数 t 的值,并不会为这个类型增加任何其他功能。这意味着,这个计算只处理标准值,但是,我们能够写代码(来增加功能),用 C# 中的查询表达式, F# 中的计算表达式。    清单 12.17 显示了在 C# 和 F# 中的类型声明

2011-11-17 09:25:12 499

翻译 12.5 自定义计算的第一步

12.5 自定义计算的第一步       本节中的示例并没有任何实际的用处,但是,它演示了一些核心概念。设计自定义计算中的第一个任务就是,考虑由这个计算生成的值所表示的类型。

2011-11-17 08:53:36 520

翻译 12.4.2 自定义 F# 语言

12.4.2 自定义 F# 语言       至止,我们所讨论过的序列表达式,都是用 seq 标识符表示,后面的代码块括在大括号中。然而,F# 允许创建我们自己的标识符,给代码块以特殊意义。通常,这个功能称为计算表达式(computation expressions),序列表达式是它的一个特例,它是由 F# 核心实现,并由编译器优化的。    我们已经看到过,计算表达式可以包含标准

2011-11-16 17:15:02 664

翻译 12.4.1 自定义查询表达式

12.4.1 自定义查询表达式     原则上,我们可以使用查询处理任何支持绑定操作的类型。这是用于函数式编程中的标准名称,像上一节中所示的类型签名的函数。从技术角度讲,我们需要实现可以由 C# 编译器所使用的方法,把查询表达式转换为标准的函数调用。我们将为 12.6 节中的 Option 的类型实现这些方法。该类型没有实现 IEnumerable,所以,标准查询运算符不能使用。

2011-11-16 11:20:38 839

翻译 12.4 可选工作流(alternative workflows)

12.4 可选工作流(alternative workflows)       计算表达式(Computation expressions)是一种 F# 功能,部分灵感是来自 Haskell 的单子(monads)。单子有个不好的名声,对于脑 bustingly 有困难的人来说,但是,也不用担心。我们将看一下如何实现一套有趣的技术,可以在 C# 中很好地处理 Option 值。还将看到如何

2011-11-16 09:43:56 658

翻译 12.3.3 平面映射(flattening projection)

12.3.3 平面映射(flattening projection)    平面映射,可以为来自源集合的每个元素的元素生成一个序列,合并所有返回的序列。我们很快就会看到,这是一个基本操作,可以用来定义其他处理操作,包括映射和筛选。有关平面映射唯一的事情就是,为每个输入元素生成多个输出元素。注意    在 LINQ 库中,这个操作被称为 SelectM

2011-11-15 21:32:58 913

翻译 12.3.2 筛选和映射

12.3.2 筛选和映射     筛选和映射是两个最常用的序列处理运算符。在第 6 章,我们用它们处理过 F# 的函数式列表,和在 C# 中的泛型 .NET List 类型。LINQ 库的 Where 和 Select 扩展方法已经可以处理序列,在 F# 中,我们可以使用两个来自 Seq 模块 (即 Seq.map 和 Seq.filter)的函数来达到相同的效果。 使用高阶函数

2011-11-15 11:12:36 594

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关注的人

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