13.1.2 异步下载网页
在我们使用异步工作流来抓取网页内容之前,需要引用 FSharp.PowerPack.dll 库,它包含了许多 .NET 方法的异步版本。开发独立的应用程序时,可以使用添加引用命令;在这一章,我们将使用互动开发模式,因此,创建一个新的 F# 脚本文件,使用 #r 指令(清单 13.1)。
清单13.1 使用异步工作流写代码 (F# Interactive...
分类:
Web程序 时间:
2015-02-09 21:41:14
阅读次数:
211
13.1.1 异步工作流为什么重要?
假设我们要下载网页的内容,在应用程序中使用,我们可以使用 System.Net 命名空间下的 WebClient 类,但下不能演示我们需要解决的问题,运行复杂、长时间的操作。相反,我们将首先显式创建 HTTP 请求,然后,下载数据:
var req =HttpWebRequest.Create("http://manning.com");
v...
分类:
其他好文 时间:
2015-02-08 11:35:44
阅读次数:
218
第十三章异步和数据驱动编程
本章介绍
■异步工作流编程
■使用 F# Interactive 浏览数据
■使用度量单位定义类型
■处理与可视化数据
我们首先引述了一次对比尔 · 盖茨的采访,他谈到他感兴趣的编程任务的类型,并描述了编写应用程序的典型情况:
从 web 获取数据,不只是考虑把它当作文本,而且要引入结构,然后… …,尝试不同的数据表现方式,且以交互的方式。…...
分类:
其他好文 时间:
2015-02-03 17:15:59
阅读次数:
211
13.1 异步工作流
有许多地方需要用到异步操作,比如,使用磁盘、调用 web 服务,或者连接到数据库,异步工作流可能显著提高性能。当应用程序执行异步操作时,很难预测操作什么时候完成。如果不能正确处理异步操作,应用程序就会效率低下,甚至可能停止响应。
要使代码能够执行异步操作,不会阻止调用线程,避免出现问题是必要的,但是,使用当前的技术很难实现。在 F# 中,这极大地简化了,是因为有了异...
分类:
其他好文 时间:
2015-02-03 17:14:17
阅读次数:
239
第四部分 函数式编程应用
虽然函数式编程肯定是优雅的,但是,你可能更感兴趣的是其实用目的:作为一种通用的风格,是有用的,在某些问题域中,它肯定更出色。我们已经看到的例子,比如,第四章绘制饼图的应用程序,和第十一章简单的照片浏览器,这些示例的主要目的,是为了演示特定的概念和技术。
第四部分则不同。在每一章,我们将花大量时间讨论实际问题,使用最适当的 F# 特点和函数式编程来解决。这些代码将...
分类:
其他好文 时间:
2015-02-03 11:05:20
阅读次数:
185
12.7.2 创建日志记录计算
清单 12.24 首先实现两个辅助函数,用于读写控制台,且两者还会把消息写入日志,所以,它们将括在 log 计算块中。为了显示如何组合非标准计算,我们在第三个函数中,使用了两个函数。在前面的示例中,我们使用 let! 基本操作,在清单 12.24 还引入了 do!。
清单 12.24 使用计算表达式的日志 (F# Interactive)
> le...
分类:
其他好文 时间:
2015-02-02 15:57:48
阅读次数:
264
12.7.3 使用计算表达式进行重构
在前一章,我们讨论过重构函数式程序的方法,最后一个主题是延迟性,它变改代码的执行方式,而不影响程序的结果。从某种意义上讲,添加延迟性也可看作是一种重构技术;计算表达式的类似之处在于,增加额外的代码,但不改变核心意思。
提示
在计算表达式和延迟性之间有密切的关系,使用 Lazy 计算类型,创建能够把代码转换成延迟计算的计算表达式,是有可...
分类:
其他好文 时间:
2015-02-02 15:56:47
阅读次数:
190
12.8 第十二章小结
在本章的第一部分,我们讨论了 .NET 序列,用 IEnumerable 类型表示,在 F# 中还称为 seq 。我们开始讨论生成序列的技术,包括高阶函数、迭代器和 F# 序列表达式。我们知道,序列是延迟的,能够创建无穷序列。我们还看到了一个实际的示例,使用颜色的无穷的序列,把绘制图表的代码,与用于在图表中生成颜色的代码分离开来。
接下来,我们讨论了如何处理序列。...
分类:
其他好文 时间:
2015-02-02 15:52:18
阅读次数:
224
12.7.1 创建日志记录的计算
这个计算将产生一个值,并能够将消息写入到本地日志记录缓冲区。这样,计算的结果将成为一个值,和包含消息的字符串列表。同样,我们使用只有一个识别器的差别联合,表示这个类型:
type Logging =
| Log of 'T * list
这个类型非常类似于我们先前讨论的 ValueWrapper 示例,只是加上了一个 F# 列表,...
分类:
其他好文 时间:
2015-02-02 12:34:04
阅读次数:
115
12.7 给计算增加日志记录
日志通常可以使用全局可变状态实现。然而,如果我们想要避免使用全局可变状态,并保持程序的纯函数性,那又该如何呢?我们有一个选择,就是把日志记录器的状态作为额外的参数值,传递我们要调用的每个函数。实现可能非常困难(想象一下,如果我们决定将另一个参数添加到这个状态中!)。
要解决这个问题,我们可以创建自定义计算类型,启用了日志记录,把日志记录器的状态隐藏在计算类型...
分类:
其他好文 时间:
2015-02-01 19:13:09
阅读次数:
243