Foundations.of.F.Sharp.01
fsharp吧
全部回复
仅看楼主
level 10
hadstj 楼主

第一章

绪论
导言这一章将主要讨论有关
F#
和函数编程的问题。
什么是函数编程?
函数编程(
FP
)是
3
个古老的编程范式。
1、

IPL
,
1955
年发明,大约早
Fortran
一年;
2、

LISP
,
1958
年发明,早
Cobol1
一年;
Fortran
和
Cobol
是命令语言,也叫过程语言。他们在科学计算、事务处理上的成功,命令语言占统治地位超过
30
年。
1970s
,出现了面向对象(
OO
),随着面向对象语言的成熟,在今天更加流行。
1950s
以来,连续开发了大量的
FP
语言(
SML
、
OCaml
、
Haskell
、
Clean
等)、类
FP
语言(
APL
、
Lisp
是最成功的应用)。
FP
一直保持学院风格至今。
命令语言早期的商业成功奠定了其统治地位。
2012年12月24日 12点12分 1
level 10
hadstj 楼主

由于企业需要解决复杂的计算,面向对象语言逐步获得广泛接受。
如今,
FP
语言提出可以解决更加复杂的问题。
纯
FP
语言把所有的程序视为函数的**,函数接收参数,返回函数值。不像命令语言、面向对象语言那样,
它允许
无副作用,使用递归而不是循环迭代。
FP
中的函数非常像数学中函数,因为它们不在程序中改变状态。
最简单的情况,给一个标识符赋值(它就不再改变),函数不改变参数值,返回的结果完全是一个新的值。
其典型的底层实现是这样的:一个值分配了内存中的一片区域,就不再改变,函数会复制一份,放在另一片域,然后对复制区域中的值进行操作,或给其他函数赋值。
在函数时,这些值会被舍弃(这是垃圾回收机制的雏形)。
纯
FP
的数学基础非常优雅。因此,用
FP
解决问题,也很优美、简洁。
无状态、递归使
FP
不如
其他编程模式更利于处理许多常见的任务。
F#
最大的优势在于,可以混合多种模式,以更方便的方式来解决问题。
FP
为什么重要?
谈到
FP
,往往认为无状态是其致使的缺陷,实际上是没有认识到其优点。
命令编程中
90%
是赋值,而
FP
中没有赋值,因此
FP
可以使程序减少
90%
。
然而,没有人相信这种无状态递归编程。正如
John
Hughes
在他的经典文章《
Why Functional Programming Matters
》中指出的:
FP
听起来像中世纪的僧侣,放弃自己快乐生活的希望,这将使他自己高尚。
2012年12月24日 12点12分 2
level 10
hadstj 楼主

John Hughes
,查尔摩斯理工大学
想了解
FP
的优点,就必须了解它能干什么,而不是它不能干什么。
FP
把函数看成值,可以传递给另外的函数。乍一听,似乎没有什么,但影响非凡。
消除函数与值之间的区别,意为着许多问题解决起来,更加自然,比起命令、面向对象编程,
FP
程序更短、更加模块化。
FP
还提供了其他功能,直接借用数学概念,这在命令语言中并不常见。
FP
语言通常提供递归函数。函数接收参数,如果参数没有解,则把
输入作为参加再传递给函数,再到有解。
因此,函数语言具有更好的“性价比”,用较少的努力,提供更好的性能和正确性。
此外,一个函数还可以返回多个值,调用这样的函数同样很方便。在第三章会有更详细的讨论和例子。
F#
是什么?
FP
是解决许多棘手问题的最好方法。但是纯
FP
并不适合常规编程。因此,
FP
语言逐步吸取了命令、面向对象的编程模式,使
FP
编写各种类型的程序都很容易。
F#
就是成功的代表,比其他
FP
做得更多。
一些最流行的
FP
语言,如
OCaml
、
Haskell
、
Lisp
和
Scheme
,一直都使用自己的运行时,使程序缺乏互操作性。
F#
是一种通用编程语言,使用通用的运行时。
F#
**了三种主要的编程模式,可以选择最好、最有效的模式去解决问题。既可以用
FP
模式、也可以组合函数、命令、面向对象风格到一个项目中,利用各自的优势。
2012年12月24日 12点12分 3
level 10
hadstj 楼主

像其他的函数语言一样,
F#
也是强类型,而且有智能提示。因此,程序员不需要太多的时间,除非显式指定的类型不存在。
F#
与
.Net
框架的基础类型库(
BCL
)无缝集成。
F#
是对象化的
Caml
模型,是成功的面向对象的
FP
语言,与
.Net
结合,完全支持
.Net
,用户可以做一切
.Net
允许的事情。
F#
编译器能编译所有的通用语言基础架构(
CLI
)命令,不改变任何代码,就支持
.Net
泛型,甚至内置提供了中间代码(
IL
)。
F#
编译器为任何
CLI
处理可执行,也能运行在任何有
CLI
的环境中,这意谓
F#
不限于
Windows
环境,还可运行在
Linux
、
Apple Mac OS X
、
OpenBSD
上(第二章将讨论
Linux
上运行
F#
)。
F#
编译器和
Visual
Studio
集成,支持智能感知和自动表达式检查,工具提示可以推断表达式的类型,这将有助于语言的使用、推广。
F#
由
Don Syme
博士发明,现在还是一个小产品,但
Don Syme
博士正在领导位于英国剑桥的微软研究院,专门从事这个项目的研究。然而,
F#
并不仅仅是研究或教学语言,已经有广泛的实际应用,并快速增长。
2012年12月24日 12点12分 4
level 10
hadstj 楼主

虽然还有其他运行在
.Net
上的
FP
,但
F#
已经成为事实上的
.Net FP
语言,由于它的质量、与
Visual Studio
的集成。
也没有其他的语言像
F#
一样容易使用、具有灵活性。
谁使用
F#
?
F#
在微软内部表现就很强劲,不仅在微软研究,而且在整个公司。
Ralf Herbrich
,微软研究院应用项目组的另一位领导,专门从事机器学习技术,是一个典型的
F#
粉丝。
“第一个应用是解析
110GB
大的日志文件,并将其导入
SQL
数据库,这些日志文件分布在
300
个目录,超过
11000
个文本文件。所有的程序只有
90
行(还包括注释),完成解析并导入数据库花了不到
18
个小时,处理速度达到惊人的每秒钟
10000
行日志!注意:我还没有优化代码,仅仅是以最常见的方法,我真的很惊讶,因为我打算至少要花一个星期才能完成代码和导入工作。
“第二个应用是分析一个数百万的反馈信息。我已经开发了这个模型的方程,我只是把它当作
F#
程序输入,从
SQL
数据库读数据,结果写入
MATLAB
数据文件,加在一起,
F#
的源代码只有
100
行(包括注释)。我再次惊讶于运行时间,处理几百万个数据,只花了
10
分钟,还仅是一台普通的桌面机。作为参考,我的
C#
程序(以前做的),有
1000
行代码,运行也没有这么快。整个任务,从开发模型方程,到完成数据输出,只花了两天。”
Ralf Herbrich
微软研究院
(
http://blogs.msdn.com/dsyme/archive/2006/04/01/566301.aspx
)
2012年12月24日 12点12分 5
level 10
hadstj 楼主

微软以外的
F#
使用也在迅速增长。
Chris
Barwick
,从事一家网站
hubFS(
http://cs.hubFS.net
)
,是一个流行的专注于
F#
的网站。我曾经部过他一个问题:为什么会选择
F#
语言。他回答:
“我已经从事科学、数学计算超过
14
年
.
在这期间,我一直在期待这样一个平台,它各方面都应该很强,必须提供有效的工具,这个工具应该容易构造和使用,使科学计算环境更加有效。
.NET
这是这样平台的代表,它的
IL
提代了跨产品的一致性。
F#
提供了在这样平台上科学与数学计算的能力。有了这些工具和其他的服务器产品,在我创建复杂系统时,我就有了广泛的选择,并且开发成本很低,运行、改进的成本也很低。
F#
是高级科学计算的基础。”
Christopher J. Barwick, JJB Research
(私人
email)
最后,我又问了
Jude O’Kelly
,
Derivatives One
公司的软件架构师,他们公司专门销售金融模型软件。为什么
Derivatives One
在他们的产品中使用
F#
:
“我们在
C#
与
F#
两种环境下分别测试了我们的金融模型,发现恨不能基本相同,但是,我们喜欢
F#
,因为它有简洁的数学语法。我们的一个问题是缺乏资料,我们认为这本书会改变这种情况。”
Jude O’Kelly, Derivatives One (private email)
这本书写给谁?
这本书主要是写给那些想迅速赶上
F#IT
专业人士,要有
.NET
框架方面的知识,最好还有
C#
或
VB
方面的知识,但这并不是必须的。任何语言的编程经验都适于学习
F#
。
即使完全就是一个初学者,以前完全没有编程经验,
F#
作为他的第一门计算机语言,也会发现这本书很容易阅读。虽然,本书并不企图介绍编程本身,但仍会提供
F#
的重要细节。
接下来介绍什么?
本书通过例子讲授
F#
,作为一种编译语言,而不是脚本语言。我的意思是,大部分例子是设计为用编译器
fsc.exe
编译,既可以是
Visual
Studio
,也可以是命令行,而是用
F#
交互环境
fsi.exe
直接运行。当然,大部分例子在两种环境下都能运行得很好。
2012年12月24日 12点12分 6
1