hmemcpy/milewski-ctfp-pdf · 上手攻略
- 仓库:hmemcpy/milewski-ctfp-pdf
- 链接:https://github.com/hmemcpy/milewski-ctfp-pdf
- 分类:academic-writing
- 作者:Tom
- 更新:2026-07-14
这是什么
这是一份将 Bartosz Milewski 经典博客系列《Category Theory for Programmers》转换为 LaTeX / PDF 的开源工程,由贡献者 hmemcpy 维护(已获 Milewski 本人授权)。项目提供三种版本:
- Haskell 版本:原版,以 Haskell 为主要示例语言
- Scala 版本:以 Scala 为主要示例语言
- OCaml / Reason 版本:以 OCaml 和 ReasonML 为主要示例语言
每种版本都有印刷版(print)和屏幕版(screen)两种 PDF 产出,印刷版为黑白或单色,适合打印;屏幕版为全彩,适合显示器阅读。
此外还有官方出版的实体书(硬皮精装 / 平装),通过 Blurb 平台发售。
解决什么问题
范畴论(Category Theory)是函数式编程中公认的高阶理论,但存在两个门槛:
- 数学味太重:传统教材从抽象代数出发,程序员读起来门槛极高。
- 缺乏编程视角:没有把范畴论概念对应到具体代码实现,懂了理论但不知道怎么用。
Milewski 的博客系列和这本书的独特之处在于:从程序员熟悉的代码出发讲范畴论,用 Haskell、Scala 等语言的具体例子让函子、单子、自然变换等概念变得可触可感。
hmemcpy 的这个工程则解决了"博客太长、不方便做笔记和打印"的问题——提供结构化的 PDF 版本,支持目录跳转、全局搜索和纸质阅读。
快速安装(下载现成 PDF)
不需要任何编译环境,直接下载是最快的方式。
下载最新 PDF
# 前往 Releases 页面手动下载
# https://github.com/hmemcpy/milewski-ctfp-pdf/releases/latest
# 或用 gh CLI(需安装 GitHub CLI)
gh release download -R hmemcpy/milewski-ctfp-pdf --pattern "*.pdf"
Releases 页面提供的文件包括(以 v1.3.0 为例):
- ctfp.pdf / ctfp-color.pdf:Haskell 版
- ctfp-scala.pdf / ctfp-scala-color.pdf:Scala 版
- ctfp-reason.pdf:Reason/OCaml 版
购买实体书
- 硬皮精装(标准版):Blurb 购买链接,2019 年出版
- Scala 平装版:Blurb 购买链接
⚠️ 注意:实体书基于 v1.3.0 tag,GitHub 上的源码可能包含后续 errata 中修正的内容,建议同时下载 PDF 配套使用。
编译源码(可选)
如果你想从源码构建 PDF,或对内容做个性化修改,需要 Nix 环境。
环境准备
# 1. 安装 Nix(macOS 推荐用 nix-darwin,Linux 直接用官方 installer)
curl -L https://nixos.org/download.html | sh
# 2. 启用 Flakes 支持(Nix 2.0+ 新特性)
# 在 ~/.config/nix/nix.conf 中添加:
# experimental-features = nix-command flakes
# 或临时启用:
# nix --experimental-features 'nix-command flakes' ...
查看可用版本
cd /path/to/milewski-ctfp-pdf
nix flake show
输出示例:
├───ctfp # Haskell 版
├───ctfp-color # Haskell 彩色版
├───ctfp-ocaml # OCaml 版
├───ctfp-reason # Reason 版
├───ctfp-scala # Scala 版
├───ctfp-scala-color
└───ctfp-print # Haskell 印刷版
构建 PDF
# 构建 Haskell 版
nix build .#ctfp
# 构建 Scala 版
nix build .#ctfp-scala
# 构建所有版本
nix build .#ctfp .#ctfp-scala .#ctfp-ocaml
构建成功后,PDF 文件位于 ./result/ 目录。
不使用 Nix 的备选方案
# 进入开发环境(包含所有 LaTeX 依赖)
nix develop
# 使用 Makefile 构建指定版本
make ctfp # Haskell 版
make ctfp-scala # Scala 版
⚠️ 注意:
nix develop需要网络下载大量 LaTeX 依赖包(完整 TeX Live),磁盘空间建议预留 10GB+。
核心内容结构
书的核心章节映射到 Milewski 博客系列,典型结构:
- 范畴论基础:什么是范畴、态射、函子
- 函子与自然变换:Fmap、Haskell Functor、编程中的应用
- 单子(Monad):Bind、do notation、本质理解
- 米田引理(Yoneda Lemma)及其对偶
- 伴随函子:左伴随 / 右伴随,编程中的例子
- 余极限、余积、余代数:在 Haskell/Scala 中的对应
每章都有 Milewski 独特的"从代码到数学,再回到代码"的教学风格,读起来不像数学书,更像和高手结对编程。
典型使用场景
| 场景 | 推荐方式 |
|---|---|
| 系统学习范畴论 | 下载 Haskell 版 PDF,配合 Milewski 博客对照阅读 |
| 已有函数式基础,想深入理论 | 直接读 PDF,跳过基础章节 |
| 在 Scala 项目中应用函数式设计 | 下载 Scala 版 PDF |
| 在学术论文中引用 | 引用博客原文或 Blurb 出版的 ISBN 版本 |
| 打印出来细读 | 下载印刷版(黑白),ctfp-print target |
坑与注意
- LaTeX 编译极慢:完整编译一次可能需要 30 分钟到数小时(取决于机器配置),Nix 的 incremental build 有缓存,但初次构建耐心等待。
- Nix 版本要求:项目使用 Nix Flakes,需要 Nix ≥ 2.4(2020 年之后的版本)。旧版 Nix 不支持,需先升级。
- macOS Silicon(M1/M2)兼容:Nix on macOS 需要 Rosetta 或原生支持,Apple Silicon 上建议用
nix-darwin或官方 installer 脚本安装。 - PDF 已足够好:大多数用户根本不需要自己编译,Releases 里的 PDF 质量已经很高了(彩色/黑白均有)。
- 勘误表:实体书出版后社区持续修正错误,见
errata-1.3.0.md和errata-scala.md,下载的 PDF 应配合勘误表使用。 - 内容版权:图书正文和 LaTeX 源码使用 CC BY-SA 4.0 许可证,可自由分享和修改,但需署名。
与同类对比
| 资源 | 形式 | 侧重点 | 适合读者 |
|---|---|---|---|
| 本仓库 PDF | 书籍 | 程序员视角的范畴论,有代码 | 想用函数式思维的开发者 |
| Milewski 博客原文 | 博客连载 | 同样内容,更新更及时 | 喜欢博客形式、跟踪最新版本 |
| 《Category Theory for Programmers》(Blurb 实体书) | 精装/平装书 | PDF 同内容精装版 | 喜欢纸质阅读 |
| 《Category Theory in Context》(Riehl) | 学术教材 | 纯数学视角,公理化 | 数学系学生 |
| 《Basic Category Theory》(Tom Leinster) | 学术教材 | 更短更紧凑 | 快速入门 |
本仓库的独特价值在于 Milewski 原创的程序员视角 + 可离线 PDF + 多种语言版本,是函数式编程爱好者学习范畴论的最佳起点,没有之一。
一句话推荐结论
想从代码出发理解范畴论?Bartosz Milewski 的这本书就是最好的入口,而 hmemcpy 的这个开源工程把博客变成了高质量 PDF——下载即用、目录完整、全文可搜索,函数式程序员书架必备。