写点什么

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

  • 2014-04-25
  • 本文字数:3205 字

    阅读完需:约 11 分钟

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#》会对他们提供许多帮助,同时也可以作为一本能够随时翻阅的参考书使用。

你可以在这里下载本书的一个免费的章节样例,也可以在 No Starch Press 出版社网站订购本书。

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

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

传统的 Hello World 示例是一种让读者迅速获得满足感的简单方式。我承认,对于新入行的程序员来说,能够让计算机完成他们的命令确实能够体验到某些成就感,但《The Book of F#》这本书并不是为新入行的程序员所准备的,它所针对的读者是富有经验的程序员,只是他们希望进入函数式编程的世界。考虑到这一点,一个普通的 Hello World 无法为读者展示这门语言的任何实用性。因此我做了一些调整,为读者首先展示了逆波兰表示法计算器,它能够用简短的代码为读者展现一系列 F#的特性,包括作为一等对象的函数、闭包、模式匹配、绑定以及模块函数。

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

是的,它们确实有所不同。类型缩写是已知类型的一种别名。比方说,string 是 System.String 的缩写,而 int 则是 System.Int32 的缩写。而类型推断是指编译器能够判断出某个给定值的正确类型。F#编译器能够准备地推断出某个绑定或参数的正确类型,但在有些情况下还需要给它提供一些帮助。在这种情况下,我们需要使用类型注解(annotation),其中包含了显式的类型名称或者是类型缩写。

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

泛型是 F#的类型系统中一个重要的组成部分。它们在 F#中所扮演的角色与它们在传统的.NET 语言中所起的作用大体上相近,但 F#与传统.NET 语言的一个关键差别在于,它的类型推断系统会尝试自动对参数进行泛型化。 这意味着如果编译器认为某个函数并不假设它的参数是某种具体的类型,那么编译器就会自动将这个函数转为泛型。编译器还能够检测出这些泛型类型参数所必须的某些限制条件,这样就在保证了类型安全的同时,也使得代码更为健壮。这一特性使我们免于定义大量的方法重载,而且往往在进行重构之前是很难一上来就想到这种使用代码的方式的。

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

从高层次角度来说,F#相较于 C#的优势在于它简洁的语法、强大的类型推断以及它对函数式编程的强调。如果要讲到特定的语言特性,那么例如调制函数(curried function)、记录类型、可区分联合、模式匹配、集成的度量单位以及对象表达式等特性是使我难以割舍 F#而选择 C#的重要因素。我的观点或许有些老套,但我还是认为在建立一个新的应用程序的前提下,只有在一种情况下我会优先选择 C#而不是 F#,那就是该应用程序需要使用到某些框架(例如 ASP.NET MVC),而这些框架在 Visual Studio 工具中尚不支持 F#。即使如此,要使用这些框架也不是没有可能的,只是需要将各种组件手动进行连接,而在 C#项目中,Visual Studio 往往已为你做好了这一切。

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

我对 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#已经有许多优秀的学习资料了。我特别为大家推荐以下一些资源:

关于作者

Dave Fancher在.NET Framework 上已经有超过 10 年的软件开发经验。他是印第安纳开发者社区的常客,经常在全美举办的活动中充当演讲者和用户讨论组中的参与者角色。在 2013 年 7 月,Dave 获得了 Visual F#方面的微软 MVP(Most Valuable Professional)。除了编写代码,以及在 davefancher.com 撰写关于代码方面的文章之外,他还非常喜爱看电影,或是打 Xbox One 游戏。

查看英文原文: The Book of F# - Review and Interview with Dave Fancher

2014-04-25 09:382641
用户头像

发布了 428 篇内容, 共 200.7 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

一封MySQL之父Monty的回信,开启彭立勋的数据库之路

华为云开发者联盟

MySQL 数据库 opengauss GaussDB 华为云数据库

Tapdata 实时数据融合平台解决方案(二):理解数据中台

tapdata

oracle mongodb

Tapdata 实时数据融合平台解决方案(五):落地

tapdata

大数据

《堂食点餐》APP前后端全部免费开源啦!

YonBuilder低代码开发平台

源码 大前端 APP开发 APICloud 外卖app

面向对象的Python编程,你需要知道这些!

华为云开发者联盟

Python 面向对象 oop 面向对象编程

架构实战营 - 模块 5- 作业

carl

🔎【Java 源码探索】深入浅出的分析HashMap(JDK7)

码界西柚

Java hashmap 6月日更 JDK7

毕业设计So Easy:珠穆朗玛FM音频电台APP

不脱发的程序猿

android 软件开发 APP开发 毕业设计 移动应用开发

我把 Spring Boot 项目从 18.18M 瘦身到 0.18M,部署起来真省事!

xcbeyond

微服务 springboot 6月日更

TCP协议

IT视界

TCP 传输协议 网络通信

奇亚Chia挖矿系统开发方案丨奇亚Chia挖矿源码功能

系统开发咨询1357O98O718

智能炒币机器人系统开发案例解析,智能炒币机器人源码设计

系统开发咨询1357O98O718

【LeetCode】你能在你最喜欢的那天吃到你最喜欢的糖果吗?Java题解

Albert

算法 LeetCode 6月日更

AT智能量化炒币机器人系统开发详解案例

系统开发咨询1357O98O718

Tapdata 实时数据融合平台解决方案(一):现代企业数据架构及痛点

tapdata

mongodb

从零开始学习3D可视化之控制对象(1)

ThingJS数字孪生引擎

物联网 可视化 3D 3D可视化 数字孪生

Tapdata 实时数据融合平台解决方案(三):数据中台的技术需求

tapdata

oracle mongodb

国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?

Serverless Devs

Serverless 容器 云原生

网络攻防学习笔记 Day33

穿过生命散发芬芳

网络攻防 6月日更

Tapdata 实时数据融合平台解决方案(四):技术选型

tapdata

大数据

带你认识大模型训练关键算法:分布式训练Allreduce算法

华为云开发者联盟

分布式训练 Allreduce算法 集合通信 分布式通信算法 大模型训练

我的树莓派居然偷偷的学会了日语

IT蜗壳-Tango

IT蜗壳教学 6月日更

webRTC实现音视频通话与屏幕共享

侠客行

WebRTC 屏幕共享 iOS屏幕共享 web屏幕共享

云上创新,阿里云视频云分享全场景音视频服务背后的场景探索与技术实践

阿里云CloudImagine

阿里云 音视频 在线教育 视频会议 直播技术

华为云携手马栏山文创园助力湖南广电荣获国家广电总局多项大奖

华为云开发者联盟

AI 5G 视频 华为云 马栏山

架构实战营模块五作业

竹林七贤

【译】JavaScript 代码整洁之道-异常处理篇

KooFE

JavaScript 大前端 异常处理 6月日更 整洁代码

写给想做程序员的半吊子应届毕业生们

北游学Java

Java Python 求职 秋招

🏆未来可期,WebRTC成为实时通讯方案的行业标准

码界西柚

音视频 WebRTC 实时通信 6月日更

一文回顾 Java 入门知识(上)

逆锋起笔

Java 后端 javase

6月2日,讲一个鸿蒙的故事

这不科技

华为 鸿蒙

《The Book of F#》 的书评以及对 Dave Fancher的采访_.NET_Anand Narayanaswamy_InfoQ精选文章