写点什么

《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:382051
用户头像

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

关注

评论

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

人工智能 | Hugging Face 的应用

测试人

人工智能 软件测试

提前锁定!2024云栖大会大数据AI参会攻略来啦

阿里云大数据AI技术

大数据 阿里云 AI 云栖大会

创意图像编辑软件Luminar Neo for mac

Mac相关知识分享

图像编辑软件

同一天!国内AI杀疯了!蚂蚁集团宣布将发布3款AI新产品!腾讯、零一万物、面壁智能推出最新大模型|AI日报

可信AI进展

Go 错误处理指北:Error vs Exception vs ErrNo

江湖十年

面试 后端 Go web 异常处理 异常机制

淘宝商品详情API中的优惠券与红包信息解析

代码忍者

API 测试 API 策略

基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

DS小龙哥

9月月更

如何塑造全方位安全远控,贝锐向日葵安全体系解析

科技热闻

管理和组织菜单栏图标Bartender 4 for Mac

Mac相关知识分享

软件

百度营销平台轻舸升级:AI MAX平均转化率提升7.2%

Geek_2d6073

深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析

汀丶人工智能

语音识别 TTS

京东商品列表数据接口为价格监控带来的便利

tbapi

京东API接口 京东商品列表数据接口

人工智能 | Hugging Face 的应用

测吧(北京)科技有限公司

测试

e3d插件下载Video Copilot Element 3D AE三维模型安装教程 支持M1/M2

Rose

解锁电商数据新视界:深度剖析京东商品详情API返回值及其应用

代码忍者

API 测试 API 策略

企业如何治理“两高一弱”?

芯盾时代

身份认证 iam 网络安全、攻防演练

PDF 制作软件Acrobat Pro DC for Mac

Mac相关知识分享

PDF

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

汀丶人工智能

TTS 文转语音

PingCAP 荣登 2024 Cloud 100 China 榜单第七

先锋IT

怪兽 AI 知识库:搭建知识库与训练垂类大模型的创新解决方案

Mr_song

AI大模型 大模型 知识库 企业知识库

Chrome Extension 消息传递

FunTester

【Tomcat源码分析 】 类加载机制的源码解读

派大星

tomcat源码解读

OpenAI 联合 SWE 发布 AI 软件工程能力测试集,Gru.ai 荣登榜首

Geek_2d6073

PS一键磨皮插件Delicious Retouch for mac(DR5白金版)

Rose

矢量图形设计软件Illustrator 2020 for Mac

Mac相关知识分享

图像设计

客户管理太难了?你可能忽视了这些常见问题!

天津汇柏科技有限公司

低代码平台 客户关系管理系统 #人工智能

自定义界面扫码,满足应用个性化定制需求

HarmonyOS SDK

HarmonyOS

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