函数式编程-初探

259 阅读5分钟

函数式编程

  1. 什么是函数式编程? 函数式编程,或称函数程序设计、泛函编程(英语:Functional programming),是一种编程范型,它将电脑运算视为函数运算,并且**[避免]使用[程序状态]以及[可变对象]**。 在函数式编程中,函数是头等对象即头等函数,这意味着一个函数,既可以作为其它函数的输入参数值,也可以从函数中返回值,被修改或者被分配给一个变量。λ 演算是这种范型最重要的基础,λ 演算的函数可以接受函数作为输入参数和输出返回值。

    • 特点:

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

    2. 基于"表达式",强调执行的结果 函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。

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

    4. 不修改状态

    5. 引用透明
      是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。 --- 任何相同的输入得到相同的输出;

    6. 惰性计算:降低运行时开销
      惰性计算的含义就是在真正调用到的时候才执行,中间步骤不真实执行程序。这样可以让我们在运行时创建很多基础函数,但并不影响实际业务运行速度,唯有业务代码真实调用时才产生开销。

    ps: 3 ,4 和 5 也是说明----避免使用程序状态以及可变对象;

  2. !!!函数式编程的基础? 函数式编程基础:函数的元、柯里化和 Point-Free |无参风格:函数的高阶组合

    • 函数的元:完全调用和不完全调用 ??如对于如下问题的处理

      ['1','2'].map(parseInt)
      
    • 函数元降维技术 :柯里化 将多入参函数的计算,变成一个个单入参函数调用;

      组合、复用

    • Point-Free |无参风格:函数的高阶组合
      函数式编程中有一种 Point-Free 风格,中文语境大概可以把 point 认为是参数点,对应 λ 演算中的函数应用(Function Apply),或者 JavaScript 中的函数调用(Function Call),所以可以理解 Point-Free 就指的是无参调用。

  3. 副作用的处理方式?

    1. 依赖注入:

      We take any impurities in our code, and shove them into function parameters. Then we can treat them as some other function’s responsibility.

    简单来说就是把副作用的部分剔出去作为参数
    2. 惰性函数(Lazy Function) 另一种控制副作用的思路是,把产生副作用的部分保护起来(抽离,封装),带着这层防护壳(新的包装函数)参与运算,直到需要结果时才打开壳取值; 这些操作相当于公式变换,只有最终[代数计算]时才会真正产生副作用; 惰性函数方案的意义:让副作用像沙子一样沉淀到最后,保证上层的水纯净透明

    todo React Hooks 的起因:函数的代数效应

    1. Effect Functor : 利用惰性函数的作用,对副作用进行封装
      ---重新抽象一个函数,知针对处理副作用,这样确保其他纯函数不被影响;

    类似于 React Hooks UseEffect;副作用都被放到一个状态节点里面去被动触发,行程一个单向的数据流动。而实际上,函数式编程语言确实也是这么做的,把副作用包裹到一个特殊的函数里面。

    如果一个函数既包含了我们的值,又封装了值的统一操作,使得我们可以在它限定的范围内进行任意运算,那么,我们称这种函数类型为 Monad。Monad 是一种高级别的思维抽象。

  4. 函数式编程与其他范式编程的区别或优缺点? 函数式编程在前端中的应用? 优点:

    • 更合理的抽象
    • 更好的组合、复用
    • !!!惰性计算:降低运行时开销
    • 更简单的使用(更小的心智负担,纯函数,不用担心副作用)
    • 语句更清晰,简短

    函数式编程在前端中的应用?

    • js 中如 Reduce....
    • React 的高阶组件

引用&拓展

  1. 函数式编程:zh.wikipedia.org/wiki/%E5%87…

  2. 结构化编程:en.wikipedia.org/wiki/Struct…

  3. 函数式编程初探: www.ruanyifeng.com/blog/2012/0…

  4. λ 演算: zh.wikipedia.org/wiki/%CE%9B…

  5. 偏函数(不完全调用函数): 偏函数 (Partial application): 定义: 在计算机科学中,局部应用是指固定一个函数的一些参数,然后产生另一个更小元的函数。 及:固定一个函数的一个或者多个参数,也就是将一个 n 元函数转换成一个 n - x 元函数。

  6. 深入理解函数式编程: tech.meituan.com/2022/10/13/…

  7. 图解 Monad www.ruanyifeng.com/blog/2015/0…

  8. !!Functors, Applicatives, And Monads In Pictures: www.adit.io/posts/2013-…

  9. !!HOW TO DEAL WITH DIRTY SIDE EFFECTS IN YOUR PURE FUNCTIONAL JAVASCRIPT(js 对于副作用的处理):jrsinclair.com/articles/20…