什么是函数式编程
函数编程(FunctionalProgramming, FP)是最早的一种编程范式。第一种FP语言是IPL,产生于1955年,比Fortran的产生早一年;第二种FP语言是1958年出现的Lisp,比Cobol的产生早一年。Fortran和Cobol都是命令式编程语言,它们在科学和商业领域中的迅速崛起使得命令式编程在30多年的时间内占主导地位。随着1970年代面向对象范式的兴起和面向对象语言的不断成熟,使得面向对象编程成为今天最流行的编程范式。
尽管强大的FP语言(SML, OCaml和Clean等)和类FP语言(Erlang,Lisp和Haskell 是在现实世界中最成功应用的类FP语言)从1950年代就在不断的发展,但是直到最近,FP依然处于学术研究状态;而当企业意识到他们需要更复杂的计算方案的时候,面向对象编程得到广泛的接受和认可。今天,解决更复杂的问题像解决简单的问题一样的FP终于被大家意识到。
纯粹的FP编程将程序看作是接受参数并返回值的函数集合,使用递归代替循环迭代,这样不会有副作用。在函数式编程中的函数类似于数学函数,它们不改变程序的状态。例如,一旦将一个值赋给一个标识符,它永远不会改变,函数不改变它的参数值,返回的是一个新的值。在典型的底层实现中,一旦一个值被分配到一块内存空间,它就不会改变。函数拷贝一个值,然后更改副本,这样原始的值可以被其他函数自由地使用,当它不再被使用时,将被扔掉(这是垃圾回收的最初想法)。
由于纯函数式编程的数学基础是很优雅的,所以FP为很多计算问题提供了美观、简洁的解决方案。但是它的无状态和递归性使得它在处理很多通用的编程任务时逊于其他的编程范式。然而, F#的优势之一就是融合了多种编程范式,允许开发人员按照需要采用最好的范式。
为什么函数式编程很重要
要知道函数式编程的重要性,我们就不应该被它的劣势所蒙蔽,而应该知道它的优势在哪。例如在函数式编程语言中,你可以把函数当作值传递给另一个函数。乍一看好像这个优势并不明显,事实上这个功能很不一般哦。模糊数据与函数之间的区别意味着许多问题都将迎刃而解。与命令式编程和面向对象编程相比,函数式编程语言在代码上也会更简洁。
函数式编程的很多其他功能都是来源于数学,不仅仅是将函数视为值这个功能,这些功能在命令式语言中是很少见的。因此,相比较于其他语言,数学运算或科学计算在函数式编程中将显得尤为简单。下面是函数式编程语言中很明显的一个特点:对待带有参数的函数,我们可以一次只传一个参数给它,如果还有参数没有传入,那么这个函数及传入的参数将作为一个整体,继续等待剩余参数的传入。而且,函数可以返回多个值,如此一来其他函数就可以随心所欲的使用这些返回值了。
F#是什么?
总的来说:F#是一种高生产率的函数式的、面向对象.NET编程语言,使用户能够编写简单的代码来解决复杂的问题。其简洁的语法和强大的类型推断,让用户更贴近他们的工作领域,并且它被整合到.NET和VisualStudio中,这样就可以更好使用强大的.NET 平台。
现在一些最流行的函数式语言(包括OCaml,Haskell,Lisp和Scheme)都是用传统的客户端运行实现的,这样会导致像缺乏互操作性的问题。而F#是一种.NET(一个公共运行时)通用的编程,它流畅的集成了三种主要的编程范式。所以用F#,你可以自由地选择最高效率的范式来解决问题。如果你是一个纯粹的人,你可以用纯函数式编程。但是你更可以很容易的在同一个程序中混合使用函数式、命令式和面向对象的编程范式,以及利用每种范式的优点。就像其他强类型语言一样,F#也是强类型的语言,并且还是类型推断性的,这样程序员就不必要花时间去显示地指定类型了(除了有类型冲突时)。更为强大的是,F#无缝地集成了.NET基础类型库,在F#中使用.NET的类库跟在C#或VB中一样简单(或许更简单)。F#是以OCaml为蓝本(一种成功的面向对象的函数式编程语言),并且很好地对.NET进行了整合和扩展。它完全的融入到了.NET,让用户做任何.NET可以做的事。F#编译器能编译所有对公共语言基础结构(CLI)的继承实现,它支持.NET泛型(无需更改任何代码),它还是支持内联中间语言(IL)代码。F#编译器不仅能执行任意的公共语言基础代码,而且能在任意有CLI的环境上编译。这意味着F#不限制于Windows平台,它可以在Linux,AppleMac OS X和OpenBSD上运行。