废话不多说,直接进入今天的话题,函数式编程。这个名字很高大上,最近几年在编程届也是炙手可热,大家都很推崇。那么问题来了,函数式编程是什么,究竟要解决什么问题,它又有着什么样的思想,是否有缺点呢。
什么是函数式编程?
网上一搜,有很多解释:
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里函数的计算可随时调用。
与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式。最主要的特征是,函数是第一等公民。最主要的特征是,函数是第一等公民。
还有非常通俗的认识:
函数式编程与命令式编程最大的不同其实在于:函数式编程关心数据的映射,命令式编程关心解决问题的步骤,这里的映射就是数学上「函数」的概念——一种东西和另一种东西之间的对应关系。这也是为什么「函数式编程」叫做「函数」式编程。
嗯,很好,我若有所思的样子。。。额。。。
函数式编程的特征
综合所看的一些资料,主要说到关于运算的合成和柯里化。合成即是说一个值需要经过多个函数演变成另一个值,就可以把这些中间步骤的函数合并成一个函数。函数柯里化,形式上来说就是把一个多个参数的函数,转变成一些了单参数的函数。
函数式编程想要解决的问题
综合之前看过的一些资料和自己的一些理解,这个范式其实是想更语义化的用函数而不是指令将计算过程表达出来,这样表现出来的就是一种数据的映射,让人理解起来非常一目了然。这样,计算过程不再杂乱,而是由具体的函数单元,执行一个个具体的计算过程,而不是将一堆计算过程放在一起,代码的阅读和维护性方面会更好。这样演变,如果可能的话(作为一个菜鸡,不确定这个结论,吨吨吨),也许写业务代码就可以利用这些函数库还有更高级的函数库,像人类语言那样的描述,让代码工作起来,岂不快哉。当然,现阶段很难达到。而且个人认为可能永远行不通。因为我算了一笔账(可能不正确,但是whatever),计算过程被函数封装,以最基本的单元,那光是语义化的计算单元封装出来的,应该是一个很大的数字,然后基于这些函数单元合成出来的函数,我了个去,不可想象。
虽然如此,但我也是矛盾的,诚惶诚恐的。毕竟语言就是这么发展的,从机器二进制码,到晦涩难懂的汇编,再到c这种中级语言,最后到现在大多数程序员在使用的高级语言,让编程变得更加容易。这些都是逐渐变得语义化,借助编译器将计算过程breakdown到底层。还是很期待那一天,使用人类自然语言,控制各种计算过程,人类的能力将无可限量。