微信号:infoqchina

介绍:有内容的技术社区媒体

《The Book of F#》 的书评以及对 Dave Fancher的采访

2014-05-01 21:27 InfoQ

由Dave Fancher编写的《The book of F#》一书对F#这门语言的各个方面进行了详细的论述,书中也涵盖了异步编程与并行编程等方面的内容。

在本书中,Fancher谈到了Visual Studio在F#这门语言中扮演的角色,并展示了可以使用在沙盒(Sandbox)与F#交互控制台中的各种脚本。接下来,他对F#中各方面的概念进行了完整的讲述,包括绑定、核心数据类型、枚举、流程控制、泛型、字符串格式化、注释的使用以及异常处理的各个步骤等等。

Fancher随后对一些相关概念进行了详细的阐述,包括类、结构、继承、接口、定制操作符、对象表达式、递归函数、lambda表达式、序列、数组、List、Set与map等等。

在本书第七章,你将通过一些代码片段学习模式表达式以及null匹配、元组、记录和集合相关方面的内容。此外还涵盖了部分主动模式与参数化主动模式等内容。

本书中另外还涵盖了其它一些方面的主题:

  • 静态度量测试

  • 构建度量公式的指导原则

  • 度量的使用

  • 静态转换因子与函数

  • 使用通用度量编写函数

  • 使用.NET反射创建引用的表达式(quoted expression)

  • 解析引用的表达式Parsing quoted expressions

  • 类型提供器(type provider)的使用

在全书结尾部分,Fancher也提供了一些高级主题的讲解,例如异步编程与并行编程,特别是任务并行库的应用。此外还专门用了一章的篇幅,通过几个简单的应用介绍了计算表达式的应用。

对于希望学习F#中各方面概念的开发者来说,《The Book of F#》会对他们提供许多帮助,同时也可以作为一本能够随时翻阅的参考书使用。

InfoQ有幸与Fancher进行了一次对话,谈论了关于F#与本书的更多内容。Fancher同时还是一位微软的MVP。

InfoQ:Dave,这本书为读者展示了一个关于逆波兰表示法(Reverse Polish Notation——RPN)计算器的应用作为示例,而不是常见的Hello World程序。为什么你会选择它作为示例呢?

传统的Hello World示例是一种让读者迅速获得满足感的简单方式。我承认,对于新入行的程序员来说,能够让计算机完成他们的命令确实能够体验到某些成就感,但《The Book of F#》这本书并不是为新入行的程序员所准备的,它所针对的读者是富有经验的程序员,只是他们希望进入函数式编程的世界。

InfoQ:在本书第三章的核心数据类型这一部分,你谈到了类型缩写和类型推断。这两个术语是否什么不同之处呢?

类型缩写是已知类型的一种别名。比方说,string是System.String的缩写,而int则是System.Int32的缩写。而类型推断是指编译器能够判断出某个给定值的正确类型。F#编译器能够准确地推断出某个绑定或参数的正确类型。

InfoQ:泛型在F#中扮演了怎样的角色呢?

泛型是F#的类型系统中一个重要的组成部分。它们在F#中所扮演的角色与它们在传统的.NET语言中所起的作用大体上相近,但F#与传统.NET语言的一个关键差别在于,它的类型推断系统会尝试自动对参数进行泛型化。

InfoQ:与C#相比,F#的优势体现在哪些方面?是否在某些特定场合下你会偏向于使用其中一种语言呢?

从高层次角度来说,F#相较于C#的优势在于它简洁的语法、强大的类型推断以及它对函数式编程的强调。如果要讲到特定的语言特性,那么例如调制函数(curried function)、记录类型、可区分联合、模式匹配、集成的度量单位以及对象表达式等特性是使我难以割舍F#而选择C#的重要因素。

InfoQ:F#与Haskell非常密切相关,你认为它们的不同之处有哪些呢?

这两者之间一个众所周知的不同之处在于:Haskell是一门纯粹的函数式语言,而F#则不那么纯粹。这一区别意味着Haskell不允许函数中产生副作用(除了在受控的场景下之外),而F#则允许带副作用的函数。

InfoQ:在本书第九章,你谈到了.NET反射机制。你认为它在F#应用程序的开发中扮演了什么样的角色呢?

我在第九章提到.NET反射,是为了讲解如何为不受读者控制的外部代码生成引用的表达式。反射在F#中的所扮演的角色和在传统.NET语言中是一致的。

InfoQ:你能为我们分享一下异步编程模型(APM)的作用和它的优势吗?

正如我在第十一章的开头部分所写的,人们长期以来一直倾向于使用异步编程模型在.NET中进行异步编程的,而F#提供了一些其它选择,例如异步工作流和基于代理(Agent)的编程方式。这些方式对线程创建、同步以及回调函数的细节进行了抽象,因而能够提高异步编程的可访问性和可维护性

InfoQ:任务并行库中的主要特性是什么?

虽然任务并行库本身并不属于F#的特性,但它通过充分利用了可用的计算机资源,提高了CPU密集型操作的伸缩性。它的一些关键特性包括:基于任务(相对于基于线程)、简易的取消操作以及简易的延续任务处理。

InfoQ:你能为我们分享一下F#是怎样从异步工作流中受益的吗?

在某些方面上,异步工作流更适用于I/O密集型操作,而任务并行库则更适用于CPU密集型操作。异步工作流能够简化对某些代价高昂的操作的处理方式,例如文件操作和发起网络请求,而不会阻塞UI线程(或者其它父线程)。与更传统的方式相比,异步工作流的独特之处在于它使用了一些常见的关键字对异步操作以及延续任务进行了隐式的处理。此外,异步工作流使用了与并行任务库相同的取消操作机制,因此不需要编写很多代码就能够很方便地取消异步操作。

InfoQ:在F#中使用计算表达式的主要优势有哪些呢?

计算表达式在F#的开发中占据重要的地位,包括序列表达式、查询表达式与异步工作流等诸多方面。从本质上来说,计算表达式就是builder类的语法糖。计算表达式在编译期进行语法解析,每个嵌套表达式都会被转化为对builder类的相应的方法调用。这种编程模型使得开发者能够定义自己的builder类,并通过相应的计算表达式转化为一系列语法元素,因此在F#中能够以一种自然的方式表达复杂的操作。

InfoQ:除了本书之外,你还有哪些关于学习F#的推荐参考资料吗?

在F#已经有许多优秀的学习资料了。我特别为大家推荐以下一些资源:

  • F#Software Foundation

  • F#for Fun and Profit

  • TryF#

  • F#Language Reference

更多精彩内容,请点击阅读原文。

***********************************

本文来自InfoQ微信公众账号:infoqchina

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。

***********************************

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 Python数据分析 布冯的历史行程 mitaka版本openstack网络之linux bridge 少年黑客:我的初恋女友,你在哪里? 参加编程竞赛对实际工作的用处