函数式编程

Posted 云深之无迹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程相关的知识,希望对你有一定的参考价值。

    函数式编程通过在函数中定义表达式和对表达式求值完成计算.它尽量避免由于状态变化和使用可变对象映入复杂性,让程序变得更加简洁明了.

    

    关于编程范式来讲并没有统一得划分标准.主要把函数式和命令式编程来做比较.二者之间得特征区别就是状态.


    在命令式语言中,计算得状态时通过不同的命名空间中变量来反应的.变量的值决定计算得当前状态,一条语句通过增加或改变(删除)变量来改变当前状态.


    主要关注赋值语句以及它如何改变状态。理想状态下,每一条语句通过改变状态,推动计算从初始状态向期望的最终结果不断靠近。然而,这种“推动计算一步步向前”的模式难以验证。需要首先定义出最终状态,找到能达到该状态的语句,从而推导出达到该状态需要的前提条件,然后重复上述步骤,直到找到一个可接受的初始状态。


    在函数式语言中,使用“对函数求值”这一更简单的概念代替改变变量值的“状态”,每次对函数求值都会在现有对象的基础上创建一个或多个新对象。    

    函数式程序即函数的组合,相应的开发过程是:首先设计一组易于理解的底层函数,然后在此基础上设计符合业务需求的高级函数。相比于由复杂的流程控制组成的指令集合,高级函数更容易可视化。

    形式上,函数求值更接近算法的数学表达。以简单的代数形式设计算法,便于处理特殊情况和边界条件,而且函数更有可能按照预期工作,也便于编写单元测试用例。

    请注意,通常函数式程序比功能相同的命令式(面向对象或者过程式的)程序更加简洁明了和高效,但这些优点并不是自然而然的,需要仔细地设计,但付出的努力通常少于设计功能类似的过程式程序。


这些代码是细分过程范式


函数式编程(0)

很纯得一段代码,严格得过程式代码


函数式编程(0)

面向对象编写的


纯粹得面向对象编写


    前面3个例子都基于变量值显式确定程序的状态,使用赋值语句改变变量值,推动计算前进。我们可以在程序中插入assert语句,确保程序状态完全按照要求变化。

    关键之处不是命令式编程存在某种缺陷,而是函数式编程是一种思维方式的转变,这种改变适用于许多场景。如何用函数式方法编写同一个算法,你会发现函数式编程并没有使算法显著变短或变快。


使用函数式范式


在函数式编程中,求3或5的倍数可分为两部分。

❏ 对一系列数值求和。

❏ 生成一个满足某个条件的序列,例如3或5的倍数组成的序列。

一个列表的和的递归形式定义如下。

       

 def sumr(seq): if len(seq) == 0: return 0 return seq[0] + sumr(seq[1:])

可以把序列的和分为两种情况。基础形式:一个长度为0的序列,和为0。递归形式:序列的和等于序列中的第一个元素加上序列中后续元素的和。

由于递归形式的序列长度小于原序列,所以任何长度有限的序列最终都会退化为基础形式。

该函数运行示例如下。


      

 >>> sumr([7, 11]) 18 >>> 7+sumr([11]) 18 >>> 18+sumr([]) 0

    第一个例子计算了包含多个值的列表之和。第二个例子演示了递归规则将第一个值seq[0]和后续所有值的和seq[1:]相加。最后一个计算包含了对空列表求和,其值定义为0。

    这个例子中,代码最后一行的+运算符和初始值0表明其为求和。如果将运算符从+改为*,将初始值从0改为1,则表明其为序列乘积。


    剩下得明天继续写,大家晚安






以上是关于函数式编程的主要内容,如果未能解决你的问题,请参考以下文章

《On Java 8》中文版 第十三章 函数式编程

web代码片段

html 将以编程方式附加外部脚本文件的javascript代码片段,并按顺序排列。用于响应式网站,其中ma

Python函数式编程,范围和变量。我哪里错了?

前端必学——函数式编程

理解响应式编程