✨从纯函数讲起,一窥最深刻的函子 Monad

lxf2023-05-05 21:52:02

本文为稀土AdminJS技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究!

专栏简介

作为一名 5 年经验的 JavaScript 技能拥有者,笔者时常在想,它的核心是什么?后来我确信答案是:闭包和异步。而函数式编程能完美串联了这两大核心,从高阶函数到函数组合;从无副作用到延迟处理;从函数响应式到事件流,从命令式风格到代码重用。所以,本专栏将从函数式编程角度来再看 JavaScript 精要,欢迎关注!传送门

序言

转眼间,来到专栏第 3 篇,前两篇分别是:

✨从历史讲起,JavaScript 基因里写着函数式编程

✨从柯里化讲起,一网打尽 JavaScript 重要的高阶函数

建议按顺序“食用”。饮水知其源,由 lambda 演算演化而来的闭包思想是 JavaScript 写在基因里的东西,闭包的“孪生子”柯里化,是封装高阶函数的利器。

当我们频繁使用高阶函数、甚至自己不断在封装高阶函数的时候,其实就已经把“函数是一等公民”这个最核心的函数式编程思想根植在心里面了。

函数可以作为参数、可以作为返回值、可以赋值给变量......

本篇带来 JavaScript 函数式编程思想中最重要的概念之一 —— 纯函数,它定义了:写出怎样的函数才是优雅的! 由纯函数概念衍生,我们将进一步探讨:

  • 函数的输入和输出
  • 函数的副作用
  • 组合函数
  • 无形参风格编程
  • 以及最后将一窥较难理解的函子 Monad 概念

话不多说,赶紧冲了~

点赞 + 收藏 + 关注 === 学会

纯函数

什么样的函数才算“纯”?

紧扣定义,满足以下两个条件的函数可以称作纯函数:

  1. 如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。
  2. 该函数不会产生任何可观察的副作用,例如网络请求,输入和输出设备或数据突变(mutation)

输入 & 输出

在纯函数中,约定:相同的输入总能得到相同的输出。而在日常 JavaScript 编程中,我们并没有刻意保持这一点,这会导致很多“意外”。