一次明确的预览版公告

2005年1月5日,唐·赛姆在技术公告中说明F# 1.0预览版已经提供下载,并解释公告稍晚于软件上线,是因为下载问题需要处理。公告把F#定位为微软研究院项目。当时的1.0代表持续试验中的语言与工具组合,使用者可以取得编译器、类库和开发环境扩展,并向设计者反馈问题。

这一版已加入对象表达式、相互依赖的反应式值,以及词法和语法分析器生成工具fslex、fsyacc。它能够生成使用泛型的代码,也保留面向较早.NET版本的非泛型代码路径。版本发布因而同时处理语言表达能力与既有平台兼容。

参考:[1]

剑桥研究团队的起点

F#源自剑桥微软研究院对函数式语言和.NET运行环境的结合探索。赛姆从OCaml的核心语言取法,最初编译器用OCaml编写,再把程序导向.NET。2002年6月4日,早期0.1版已经随ILX项目公开。设计上选择共享.NET的数据表示和异常机制,使F#程序与C#等语言能够相互调用。

完成.NET泛型的一阶段工作后,赛姆于2004年加强F#开发。詹姆斯·马杰特森在2005年3月加入,参与性能测试和内部项目支持。团队使用随机π机器SPiM、静态驱动程序验证器和Terminator等已有OCaml代码检验语言,借实际迁移问题判断实现是否足够可用。

参考:[2]

短脚本也要有类型约束

赛姆在2005年的技术文章中指出,科学家希望像使用数学脚本工具那样迅速试验,又需要把成果扩展成性能可靠的程序。F#把函数、元组、列表和模式匹配作为基本表达手段,同时调用.NET现成的图形界面、文件及其他类库,避免为一种新语言重新建立全部软件配套。

它的简短写法来自类型推断。编译器从函数调用和运算中收集约束,判断输入与结果的类型;约束互相冲突时就报告错误。例如一个函数接收字符串、返回两个计数值,其类型可以写成“字符串到整数对”,即使程序员没有逐项声明这些类型,编译器仍能检查调用是否一致。

参考:[3]

平均值附近的三个数

2005年文章给出一个名为DistanceFromAverage的函数:先求三个数a、b、c的平均值avg,再定义内部函数diff,计算某个数与avg之差的平方,最后对三个平方差之和开平方。内部函数直接使用外层的avg,不必在每次调用时再把平均值传入。

代入1.0、2.0、3.0时,平均值为2.0,平方差依次为1、0、1,结果为根号2。这个例子展示了局部函数、词法作用域和.NET平方根函数如何放在一起;它计算的是偏差向量的长度。代码所需的浮点数类型由运算确定,简洁与编译期检查可以兼得。

参考:[3]

数据模型与开发工具一起推进

对于符号运算,F#可以把表达式定义为几种互斥的结构,如常数、加法和乘法。模式匹配据此区分不同情况,再递归处理子表达式。这样的可辨识联合类型把“有哪些合法形式”直接写进数据定义,适合组织语法树和其他具有分支结构的信息。

开发工具也逐步跟上。1月公告附带的Visual Studio扩展要求Visual Studio 2005 Beta 1及相应SDK,支持语法着色、解析、类型检查和初步项目管理;智能提示仍在计划中。这种与既有开发环境衔接的方式,使程序员能够在熟悉的编辑与项目组织方式中试用新语言。

参考:[1] [3]

随后扩展到查询与程序片段

2006年的研究进一步试验“引用”机制:把经过类型检查的F#表达式保存为可分析的结构,再交给其他执行组件。赛姆在ML工作坊论文中演示从员工表筛选居住在伦敦的人并取其地址,程序中的条件与选择表达式经LINQ组件转为SQL,交由数据库执行。

论文还探索借助Accelerator在图形处理器上运行数据并行程序,以及利用LINQ组件动态生成本机代码。这些后续实验把.NET互操作从调用已有函数扩展到连接数据库、图形处理器与本机代码等不同计算方式。

参考:[4]