什么是函数式编程
2010-09-14 13:13:57 来源:WEB开发网我们已经在本教程中学了有一段时间了,然而我们还没有真正考虑过函数式编程(functional programming)。目前文中讲述的一系列特点——丰富的数据类型、模式匹配、类型推断、嵌套函数——这些你只能想像存在于某种“超级C”语言中。有了这些神奇特点之后,就能让你的代码更精炼、更容易阅读并且错误更少,但但实际上它们和函数式编程的关系却不是很大。事实上我要说的观点是函数式语言如此神奇并非是因为其函数式编程,而是因为我们长时间局限于类C语言之中,而同时编程的界限却在不断地继续扩展。所以当我们在第N次重复写struct { int type; union { ... } }的时候,ML和Haskell程序员已经可以对数据类型使用安全变体和模式匹配了。当我们还在小心翼翼地free每个我们所malloc的东西时,自从80年代就已经有能比手工编码更好的垃圾收集器了。
好吧,说完这些之后,我就可以告诉你什么是函数式编程了。
最基本的定义为(不过不是很让人明白的):在函数式语言中,函数是第一等公民。
光说不练,难以令人理解,所以先看一个例子:
# let double x =
x * 2
in
List.map double [ 1; 2; 3 ];;
- : int list = [2; 4; 6]
在这个例子中,我首先定义了一个叫做double嵌套函数,输入一个参数x并返回x * 2。map对给定的列表([1; 2; 3])中的每个元素调用double,产生了这个结果:一个新的列表,其中每个数字都变成了原来的两倍。
我们已经知道map是一个高阶函数(higher-order function,简称HOF)。高阶函数就是说这个函数可以用另一个函数作为它的一个参数,听起来很深奥的说法。
目前来说这个概念还很简单。如果你熟悉C/C++,就会觉得它看上去好像就是传递一个函数指针。Java则有种叫做匿名类的讨厌东西,类似于一种迟钝的、冗长的闭包。如果你了解Perl,那么你可能已经知道并正在使用Perl的闭包以及Perl的map函数,它就是我们正在讨论的东西。实际上Perl也是一个很好的函数式语言。
更多精彩
赞助商链接