16.6 第十六章小结
在本章中,我们介绍了函数方式技术开发有响应的应用程序。我们首先讨论在 F# 中的一等事件,把事件当成标准的值使用,可以传递给函数,或从函数返回。这样,可以使用高阶函数(比如,Observable.filter 和 Observable.map)处理事件,使代码更具声明性,与使用高阶函数或 LINQ 查询处理列表的方式相同。
对于更具动态的行为,这种声明的风格运行得不好。F# 提供了一种方便的替代方案,即在第 13 章中引入的异步工作流。它使写出来的流控制,看起来佝同步代码,但是,基于发生的事件执行。这种技术对于把状态机翻译成代码,特别好,通过把状态自然映射到递归调用的函数。
最后,我们面临在应用程序中管理状态的问题,可以编码为处理图形用户界面事件的异步工作流。我们看到,这可以如何在 F# 中,通过有 MailboxProcessor<'T> 类型的消息传递进行处理。这种类型也可以用于并行的情况,所以,我们最后用一个示例显示如何从多线程应用程序中使用它。
不幸的是,我们在这一章中看到的大部分的例子,是依靠异步工作流的,所以,它们不能真正直接转化为 C#。在 C# 中,可以使用新的 .NET 4.0 System.Threading.Tasks 命名空间,写出类似的模式。各种项目都试图提供更优雅的语法,比如,并发性和协调运行时(Concurrency and Coordination Runtime)[Richter, 2006]。然而,它们提供的都不如 F# 清晰。本章后来展示的消息传递并发性(message-passing concurrency)技术有多种不同的形式存在。F# 的实现接近于 Erlang 风格的消息传递(例如,Concurrent Programming in Erlang [Armstrong, et al., 1996]),但其他的方案也存在。其中有一个还作为 C# 2.0 的库,所以,可以看一下加入并发库(Joins Concurrency Library)[Russo, 2007]。