函数式编程

本文首发于个人GitHub博客,其它博客同步更新。git


函数式编程

什么是函数式编程

  • 程序的本质:根据输入经过某种运算得到相应的输出
  • “函数”:数学中的函数即映射关系:y = sin(x),y和x的关系
  • 纯函数:相同的输入始终要获得相同的输出
  • 做用:函数式编程就是用来描述数据之间的映射

函数的特性

函数是一等公民

  • 1.函数能够存储在变量中
  • 2.函数做为参数(高阶函数)
  • 3.函数做为返回值(高阶函数)

高阶函数

  • 能够把函数做为参数传递给另外一个函数github

    • 优势:灵活、不须要考虑函数内部如何实现
  • 能够把函数做为另外一个函数的返回值

闭包

  • 定义:函数和周围的状态(词法环境)的引用捆绑在一块儿造成闭包
  • 能够在另外一个做用域中调用一个函数的内部函数并访问到该函数的做用域中的成员

函数式的基础

纯函数

  • 定义:相同的输入永远会获得相同的输出,且没有反作用
  • 相似映射关系y = f(x)
  • 功能库:lodash数据库

    • 纯函数必须有输入和输出
    • 函数式编程不会保留计算中间的结果,因此变量不可变(无状态的)
    • 能够把一个函数的执行结果交给另外一个函数处理

反作用

  • 外部因素对程序结果的影响
  • 来源:配置文件、数据库、获取用户的输入……

柯里化

  • 定义:调用一个函数只传递部分的参数,而且返回新的函数,新函数去接受剩余的参数,而且返回相应的结果编程

    • 当一个函数有多个参数的时候,先传递一部分参数调用它(这部分参数之后永远不变)
    • 而后返回一个新的函数接收剩余的参数,返回结果
  • Lodash里的柯里化数组

    • _.curry(func)
    • 功能:该函数接收一个或者多个func的参数,若是func所须要的参数都被提供则执行func并返回执行的结果,不然继续返回该函数并等待接收剩余的参数
    • 参数:须要柯里化的函数
    • 返回值:柯里化后的函数

管道

函数组合

  • 定义:若是一个函数要通过多个函数处理才能获得最终值,这个时候能够把中间过程的函数合并成一个函数
  • 通俗:函数就像是数据的管道,函数组合就是把这些管道链接起来,让数据穿过多个管道造成最终结果
  • 函数组合默认是从右到左执行
  • loadsh中的组合函数闭包

    • _.flow()从左到右运行
    • _.flowRight()从右到左运行
  • 知足结合律:即,能够把g和f结合,还能够把f和g结合

函子

概念:是一个特殊的容器,经过一个普通的对象来实现,该对象具备map方法,map方法能够运行一个函数对值进行处理(变形关系)

  • 经过函控制反作用,也能够进行异常处理、异步操做等
  • 函数式编程的运算不直接操做值,而是由函子完成
  • 函子就是一个实现了map契约的对象
  • 函子就是一个盒子,盒子封装了一个值
  • 处理盒子的值,须要给map方法传递一个处理值得函数(纯函数)
  • 最终map方法会返回一个包含新值的盒子(函子)

Functor

MayBe

  • 函子处理空值问题异步

    • map内部进行三元判断

Either

  • Either函子能够用来作异常处理函数式编程

    • 使用try{...}catch{...}分别调用两个函子对象,一个返回传入函数,一个返回正常输出结果

IO

  • _value做为一个函数处理,把不纯的操做交给调用者来处理

Task

  • folktale标准函数式编程库函数

    • 处理异步任务

Monad

  • 解决函子嵌套问题IO(IO(x))spa

    • 利用join、flatMap返回_value
面向对象:把事物抽象成程序中的类和对象,经过封装、继承和多态演示事物联系(抽象事物)
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息