函数式编程

什么是函数式编程

函数式编程是一种编程规范,常见的编程规范有命令式编程,函数式编程,逻辑式编程 ,常见的面向对象编程也是一种命令式编程。

命令式编程 :命令式编程是面向计算机硬件的抽象,有变量 (对应存储单元),赋值语句 (获取,存储指令),表达式 (内存引用和算术运算)和控制语句(跳转指令),一句话总结,命令式程序就是一个冯诺依曼的指令序列。

函数式编程 :函数式编程是面向数学的抽象,将计算描述为一种表达式求值,一句话总结,函数式程序就是一个表达式。严格意义上的函数式编程意味着不使用可变的变量,赋值,循环和其他命令式控制结构进行编程。

函数式编程的特点

函数式编程中的函数 这个术语不是指计算机中的函数,而是指数学中的函数 ,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。

  • 函数是第一等公民

    ”第一等公民“指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

  • 只用“表达式”,不用“语句”

    “表达式”(expression)是一个单纯的运算过程,总是有返回值;“语句”(statement)是执行某种操作,没有返回值。

    原因: 函数式编程的开发动机,一开始就是为了处理运算(computation),不考虑系统的读写(I/O)。“语句”属于对系统的读写操作,所以就被排斥在外。

    注意:在实际的编程中不做I/O是不可能的,所以函数式编程只是要求把I/O限制到最小,不要有不必要的读写行为,保持计算过程的单纯性。

  • 没有“副作用”

    指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。函数式编程强调没有“副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不能修改外部变量的值。

  • 不修改状态

    函数式编程只是返回新的值,不修改系统变量。在其他类型的语言中,变量往往用来保存“状态”(state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子是递归 。由于使用了递归,函数式语言的运行速度比较慢,这也是长期不能在业界推广的主要原因

    注意: 纯函数式编程语言中的变量也不是命令式编程语言中的变量,即存储状态的单元,而是代数中的变量,即一个值的名称。 变量中的值是不可变的(immutable),也就是说不允许像命令式编程语言中那样多次给一个变量赋值。eg,命令式编程语言写“x = x +1”,这依赖可变状态的事实,在数学上是不成立的。

  • 引用透明

    引用透明(referential transparency),指的是函数的运行不依赖于外部变量或“状态”,只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是形同的。

    其他语言可能引用的全局变量导致函数的返回值往往与系统状态有关,不同状态之下,返回值是不一样的。这就叫”引用不透明“。

函数式编程的好处

  • 函数即不依赖外部的状态也不修改外部的状态,函数调用的结果不依赖调用的时间和位置,这样写的代码容易进行推理,不容易出错。这使得单元测试和调试都更容易。
  • 不变性的好处是多线程之间不共享状态,不会造成资源竞争(Race Condition),能够充分利用多核的特性,进行并发处理。
  • 函数式编程不像命令式编程那样关注执行步骤,这个系统提供了优化函数式程序的空间,包括惰性求值和并行处理
  • 函数式语言是面向数学抽象,更接近人的语言,而不是机器语言,代码会比较简洁,也更容易被人理解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值