您的位置:首页 > 编程语言

函数编程为啥重要

2014-03-06 18:20 211 查看
函数编程为啥重要?

谈到函数编程,人们往往认为无状态是其致命的缺陷,实际上是没有认识到其优点。可以证明,通常命令式程序中有90% 是赋值语句,而函数式程序中没有赋值,因此函数式程序可以使程序减少90%。然而,许多人并相信这个结论,并不想用无状态的递归编程。正如John Hughes在他的经典论文《Why Functional Programming Matters》中指出的:函数式程序员听起来有点像中世纪的僧侣,放弃自己快乐的生活,希望自己高尚。

John Hughes,查尔摩斯理工大学(http://www.math.chalmers.se/~rjmh/Papers/whyfp.html)

想了解函数编程的优点,就必须知道它能干什么,而不是它不能干什么。例如,函数编程把函数本身看成值,可以传递给别的函数。乍一听,似乎没有什么,但影响非凡。消除函数与值之间的区别,意为着许多问题解决起来更加自然,比起命令式、面向对象程序,函数式程序更短、更加模块化。

函数语言不仅把函数看成值,而且提供的其他功能直接借用数学概念,这在命令式语言中并不常见。函数编程语言通常提供curried 函数,一个函数有若干参数,一次只传递其中几个参数,残差的函数会处理余下的参数。函数语言通常还提供更好的类型系统,能用较少的努力,提供更好的性能和正确性。

另外,一个函数也可以返回多个值,调用这样的函数同样很方便。在第三章会有更详细的讨论以及大量的例题。

[

这里,有两点需要说明一下:

1、curryed 函数:

curry 这个术语来自Haskell Brooks Curry,发明了局部函数的概念。

维基百科上讲:

Haskell Brooks Curry(哈斯凯尔·卡瑞,1900年9月12日-1982年9月1日),美国马萨诸塞州米里镇人,数理逻辑学家,专长于组合子逻辑理论。

编程语言HaskellBrooks
Curry都是以他的名字来命名的。

1916年他进入哈佛大学,原先预备攻读医学,但很快就转换到数学领域。1920年毕业后,他在麻省理工学院工作两年,之后又回到哈佛大学继续学业,1924年得到物理学硕士学位,之后取得数学博士学位。

Currying 是说有一个函数,它可接收多个参数,但是,一次传递给这个函数的参数数量少于其所需要的参数数量,这样就形成一个新的函数,接收余下的参数,并返回结果。实际上,就是方程变换,把有三个未知数的方程变换成含两个未知数的方程,再变换成含一个未知数的方程。

举个例子说明一下(不一定准确)。printfn 函数,简单地说,有两个参数,一个是格式化参数,另一个是打算输出的值,不同类型的值,格式化参数不同。比如:

printfn “%s” 用于输出字符串值

printfn “%d” 用于输出整数值

printfn “%A” 用于输出任意类型值

在某些时候(比如调试程序时)为了少打一些字,就可以定义几个Curryed 函数:

let ps = printfn “%s”

let pd = printfn “%d”

let pa = printfn “%A”

在需要输出时,调用对应的Curryed 函数:

ps “Hello World!”

pd 123

pa [1..9]

这样,是不是很方便呢?当然,发明Currying 的目的应该远不是只为了方便书写,不过,我的水平只能达到这一层次,它的好处是需要慢慢体会的。

2、type systems withmuch better power-to-weight ratios 的翻译:

类型系统是编程语言最核心也是最基础的部分。通过定义一组规则表示数据、处理数据。

功率与重量的比,则是一个具体的类型,与类型系统的抽象数据似乎并不搭界。或者是说,这是一个我并不知道的成语。那么,这句话是否应该这样理解,函数语言的类型系统,体积更小,功能更强。不能准确的翻译,只能猜测了。有时我还有一种想法,他写的书并不一定是红楼梦,我却以读红楼梦的方法读书,是不是有过度解读的问题。因此,非技术细节,搞不懂的就忽略好了。

]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: