函数式编程是一种编程范式,通过应用和组合函数来构建程序。 其核心思想是将运算过程(也就是函数)作为值。可以按需组合、传递、调用。
函数作为一等公民#
指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数传入,或者作为别的函数的返回值。
比如:const fn = () => {},在早期 Java 中,这种函数作为值的实现是做不到的。
纯函数与副作用#
函数式编程提倡函数返回值,而非修改值。也就是函数应该尽可能表达计算过程,而不对变量进行隐式修改,计算的依赖只能是函数的参数,计算的结果应该是新变量,而非对旧变量的修改。这样的函数称为纯函数。
但在实践中,我们的模型往往是有状态的,因此必然存在某些点需要处理这些状态。而函数对这种外部状态的改变则称为副作用。
组合与柯里化#
组合。
Monad、Functor#
单子是一种将计算结构化为一系列步骤的方法,其中每个步骤不仅产生一个值,而且还产生一些有关计算的额外信息,例如潜在的失败、不确定性或副作用。更正式地说, monad 是一个类型构造函数 M,配备两个操作, return : (a : A) -> M (A) ,它将一个值提升到 monadic 上下文中,并绑定:<A,B> (m_a : M (A), f : A -> M (B)) -> M (B) 链接单子计算。简单来说,monad 可以被认为是在类型构造函数上实现的接口,允许函数抽象实现 monad 的各种类型构造函数变体(例如 Option、List 等)。