Skip to content

封面

关于本书

本书系统讲解函数式范式的基础知识。我们将使用全球最流行的函数式编程语言(Functional Programming):JavaScript。有人可能认为这个选择并不明智,因为它与当前主流以命令式为主的编程文化相悖。但我认为这是学习FP的最佳途径,因为有以下几个重要原因:

  • 您很可能每天都在工作中使用它

这样您每天就能在实际工作中应用所学知识,而不必在业余时间用晦涩的FP语言做些试验性项目。

  • 我们无需预先掌握全部概念即可开始编程实践

在纯函数式语言中,若不用单子(Monad)就无法记录变量或读取DOM节点。但在学习过程中,我们可以『灵活处理』以逐步提升代码纯度。由于JavaScript具备混合范式特性,在知识尚有不足时,可以暂时依赖常规的编程方式。

  • 该语言完全具备编写一流函数式代码的能力

借助一两个小型库的辅助,我们可以完全复现Scala或Haskell等语言的特性。虽然面向对象编程在行业中占主导地位,但在JavaScript中的实现显得笨拙:不得不频繁使用bind防止this指向错误;需要用各种变通方案处理new关键字遗漏引发的异常行为;私有成员只能通过闭包实现。这种状况如同在高速路边露营,又好似穿雨靴跳踢踏舞般笨拙。对多数人而言,函数式编程反而更为自然。同时,这些数学化的接口具有普遍适用性,您可以在Swiftz、Scalaz、Haskell、PureScript等数学文法环境中触类旁通。

当然,类型化函数式语言无疑更适合本书提倡的编程范式。JavaScript将作为学习范式的工具,其应用范围取决于读者。

在线阅读

最佳阅读体验请访问Gitbook在线阅读版

  • 快速导航侧边栏
  • 浏览器内练习题
  • 深入示例讲解

代码交互实践

为使学习高效且避免冗长的理论讲解,建议同步实践本书中的概念。某些概念初次接触时可能难以掌握,动手实践能帮助加深理解。

书中所有函数和代数数据结构均在附录中汇总,对应代码已发布为npm模块:

bash
$ npm i @mostly-adequate/support

另外,每章练习可直接在编辑器中运行!例如,完成exercises/ch04目录下的exercise_*.js文件后,执行:

bash
$ npm run ch04

下载书籍

获取预生成的PDFEPUB版本,请访问最新发行版的构建产物

本地构建指南

⚠️ 当前项目配置稍显陈旧,本地构建可能遇到各种问题。推荐使用node v10.22.1和最新版Calibre。

关于Node版本说明

由于推荐的node版本(v10.22.1)较旧,系统可能未预装。建议使用nvm进行多版本管理:

  • 安装所需node版本:
nvm install 10.22.1
nvm install 20.2.0
  • 切换版本:
nvm use 10.22.1
node -v // will show v10.22.1 
nvm use 20.2.0
node -v // will show v20.2.0

因项目自带.nvmrc文件,可通过以下命令自动处理版本:

// being anywhere inside this project
nvm install
node -v // will show v10.22.1

完整构建命令序列

综合上述说明,本地生成电子书的完整命令序列如下:

git clone https://github.com/MostlyAdequate/mostly-adequate-guide.git
cd mostly-adequate-guide/
nvm install
npm install
npm run setup
npm run generate-pdf
npm run generate-epub

注意!生成电子书需安装ebook-convert安装指南

目录索引

详见SUMMARY.md

贡献指南

详见CONTRIBUTING.md

翻译信息

详见TRANSLATIONS.md

常见问题

详见FAQ.md

未来规划

  • 第一部分(1-7章)为基础教程。由于这是初稿,发现错误会及时更新,欢迎协助修正!
  • 第二部分(8-13章)涵盖函子(Functor)、单子(Monad)直至可穿越式(Traversable)等类型类。计划补充转换器(Transformer)和纯应用的内容。
  • 第三部分(14+章)将探索实用编程与学术理论的结合,包括余代数(Comonad)、F-代数、自由单子(Free Monad)、米田引理(Yoneda)等范畴论概念。

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.