16 第十六章 开发有响应的函数式程序
本章讨论
■ 响应事件,及在 F# 中的声明
■ 事件作为第一类值使用
■ 用异步工作流编程 GUI
■ 使用消息传递并发
这最后一章是关于响应外部事件的,比如用户输入。我们还将讨论另一个 F# 功能,可用于创建并发程序。尽管这些听起来好像不相关的主题,但是,会看到探索它们的相似之处。本章中看到的所有库和示例,都共享一个相似的体系结构,因此,我们先看一下通常的有响应的体系结构。
我们写的很多代码(命令式和函数式编程两种),假定它是在驾驶座位上,即,每一步发生什么,都在我们的控制之中。这种模式往往被用户界面所打破。一个 Windows 应用程序需要处理各种用户界面事件:它也可能作出回应,以完成异步 web 服务请求或后台任务。这种类型的应用程序的执行由事件控制,应用程序只关心对它们的反应。出于此原因,这一原则有时被称为控制反转(inversion of control),有时轻易被称为好莱坞原则(the Hollywood Principle)[1]。
响应式代码标准的 .NET 机制是事件。订阅服务器添加事件处理程序,在事件触发时调用。事件处理程序需要可变状态,保持对订阅的跟踪,这与函数式原则是有点背道而驰,但它是最简单的方法,被许多现有的 .NET 类所使用。我们已经看到过如何在 Windows 窗体应用程序中使用它,所以,这里的讨论会相当简单。相反,我们将重点讨论一些由 F# 提供的更加函数式的方法。
我们首先看一下处理事件的声明式方式,这有点类似于声明式列表处理。然后,再看一下用异步工作流来处理事件,这种方法与控制反转完全相反,它以我们至少出现的方式写代码,来控制应用程序做什么。最后,我们会考虑在响应式的应用程序中的状态管理,和消息传递的并发性,这是写多线程应用程序的一项强大技术。
-----------------
[1] 不要给我们打电话,我们会打电话给你。