函数式编程
-
什么是函数式编程? 函数式编程,或称函数程序设计、泛函编程(英语:Functional programming),是一种编程范型,它将电脑运算视为函数运算,并且**[避免]使用[程序状态]以及[可变对象]**。 在函数式编程中,函数是头等对象即头等函数,这意味着一个函数,既可以作为其它函数的输入参数值,也可以从函数中返回值,被修改或者被分配给一个变量。λ 演算是这种范型最重要的基础,λ 演算的函数可以接受函数作为输入参数和输出返回值。
-
特点:
-
函数是"第一等公民" 所谓"第一等公民"(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
-
基于"表达式",强调执行的结果 函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。
-
没有"副作用"-- 纯函数 所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。 函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
-
不修改状态
-
引用透明
是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。 --- 任何相同的输入得到相同的输出; -
惰性计算:降低运行时开销
惰性计算的含义就是在真正调用到的时候才执行,中间步骤不真实执行程序。这样可以让我们在运行时创建很多基础函数,但并不影响实际业务运行速度,唯有业务代码真实调用时才产生开销。
ps: 3 ,4 和 5 也是说明----避免使用程序状态以及可变对象;
-
-
!!!函数式编程的基础? 函数式编程基础:函数的元、柯里化和 Point-Free |无参风格:函数的高阶组合
-
函数的元:完全调用和不完全调用 ??如对于如下问题的处理
['1','2'].map(parseInt) -
函数元降维技术 :柯里化 将多入参函数的计算,变成一个个单入参函数调用;
组合、复用
-
Point-Free |无参风格:函数的高阶组合
函数式编程中有一种 Point-Free 风格,中文语境大概可以把 point 认为是参数点,对应 λ 演算中的函数应用(Function Apply),或者 JavaScript 中的函数调用(Function Call),所以可以理解 Point-Free 就指的是无参调用。
-
-
副作用的处理方式?
- 依赖注入:
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 的起因:函数的代数效应
- Effect Functor : 利用惰性函数的作用,对副作用进行封装
---重新抽象一个函数,知针对处理副作用,这样确保其他纯函数不被影响;
类似于 React Hooks UseEffect;副作用都被放到一个状态节点里面去被动触发,行程一个单向的数据流动。而实际上,函数式编程语言确实也是这么做的,把副作用包裹到一个特殊的函数里面。
如果一个函数既包含了我们的值,又封装了值的统一操作,使得我们可以在它限定的范围内进行任意运算,那么,我们称这种函数类型为 Monad。Monad 是一种高级别的思维抽象。
- 依赖注入:
-
函数式编程与其他范式编程的区别或优缺点? 函数式编程在前端中的应用? 优点:
- 更合理的抽象
- 更好的组合、复用
- !!!惰性计算:降低运行时开销
- 更简单的使用(更小的心智负担,纯函数,不用担心副作用)
- 语句更清晰,简短
函数式编程在前端中的应用?
- js 中如 Reduce....
- React 的高阶组件
引用&拓展
-
函数式编程初探: www.ruanyifeng.com/blog/2012/0…
-
偏函数(不完全调用函数): 偏函数 (Partial application): 定义: 在计算机科学中,局部应用是指固定一个函数的一些参数,然后产生另一个更小元的函数。 及:固定一个函数的一个或者多个参数,也就是将一个 n 元函数转换成一个 n - x 元函数。
-
深入理解函数式编程: tech.meituan.com/2022/10/13/…
-
图解 Monad www.ruanyifeng.com/blog/2015/0…
-
!!Functors, Applicatives, And Monads In Pictures: www.adit.io/posts/2013-…
-
!!HOW TO DEAL WITH DIRTY SIDE EFFECTS IN YOUR PURE FUNCTIONAL JAVASCRIPT(js 对于副作用的处理):jrsinclair.com/articles/20…