- 教程
【免费下载链接】learnhaskell
Learn Haskell
本文围绕 learnhaskell 仓库的印尼语版学习指南 guide-id.md 展开,逐层拆解这份"基于多年帮助他人学习经验沉淀而成"的 Haskell 入门路线图:从工具选型(Stack vs. Haskell Platform)、社区参与规范,到核心课程路径(cis1940 → FP Course → cs240h)、再到中高级主题的扩展资源。读完本文,你将获得一条可直接执行的学习路径,并知道仓库中 specific_topics.md、dialogues.md、install.md、coc.md 等文件各自该在什么阶段、以什么方式使用。
一、这份指南是什么:经验驱动的推荐路径
guide-id.md 的引言明确交代了它的性质:这不是一本教科书,而是一份基于帮助他人学习 Haskell 的实战经验总结出来的推荐路径,推荐列表出自 Haskell Book,guide-id.md 是其印尼语翻译。
全文贯穿一个核心学习心态,值得在开始前先记住:
不要纠结于暂时无法立即理解的东西,继续前进!(Don't sweat the stuff you don't understand immediately. Keep moving!)
这是 Haskell 学习曲线陡峭、概念高度抽象(Monad、Applicative、惰性求值等)的情况下,作者给出的最实际建议:先建立"能跑起来"的正反馈,再回头深化理论。
二、安装 Haskell:用 Stack,不要装 Haskell Platform
2.1 为什么首选 Stack
指南在安装章节给出的第一条指令非常明确:获取 Stack 来安装 GHC 并构建你的项目。Stack 的核心价值在于:
- 自动管理 GHC(Glasgow Haskell Compiler)的安装与版本切换;
- 以项目为单位管理依赖与构建,规避依赖地狱;
- 提供
stack new(创建项目)、stack build(构建)、stack ghci(启动 REPL)等一体化工作流。
即使你对 Stack 一无所知,作者也提供了 Stack 的入门教学视频作为铺垫(详见 guide-id.md 原文)。
2.2 明确的禁令:不要安装 Haskell Platform
指南用加粗语气强调:不要按照 Haskell.org 的指引安装 Haskell Platform,而是直接获取 Stack("DO NOT INSTALL HASKELL PLATFORM")。理由指向 2015 年 9 月 haskell-community 邮件列表中的讨论(链接见 guide-id.md 原文):Haskell Platform 提供的预编译包体系与现代依赖管理方式不兼容,尤其是在沙箱(sandbox)与 Stackage 快照体系普及之后。
2.3 仓库内的历史安装资料:install.md
仓库保留了旧版安装手册 install.md,文件开头即声明 "These instructions are deprecated"(这些说明已弃用),仅留给需要最小化安装的读者参考。但其中对 Haskell 工具链概念的解释依然值得一读:
- Haskell:一门语言,其最新语言报告为 Haskell 2010;
- GHC:最主流的 Haskell 工作方式,集编译器、REPL(解释器)、包管理于一体;
- Cabal:负责项目管理与依赖解析的工具,等价于 Ruby 的 Bundler、Python 的 pip、Node 的 NPM、Java 的 Maven。GHC 负责打包本身,Cabal 决定安装哪些版本。
install.md 还保留了 Ubuntu(hvr/ghc PPA)、Debian、Fedora、Arch Linux、Gentoo、macOS、Windows 等平台的 GHC + Cabal 手动安装步骤。对于今天的读者,这些步骤更多是理解工具链的历史背景:当前推荐的路径始终是 Stack。
三、先加入社区:IRC、邮件列表与行为准则
3.1 官方社区入口
guide-id.md 指明的官方社区渠道包括:
- IRC 频道:
#haskell-beginners。注意:印尼语版仍指向 Freenode 网络,而英文原版 README.md 已更新为Libera Chat网络,IRC 网页客户端入口以英文版为准; - Haskell 邮件列表(Mailing lists):适合异步提问与深度讨论。
3.2 社区行为准则(coc.md)
参与频道前应阅读 coc.md(指南中的"Panduan Komunitas"一节),其要点可概括为:
- 保持友善礼貌——刻薄与粗鲁会吓跑学习者;
- 不做低质量批评(Low-effort criticism);
- 不把事物描述为"简单"或"微不足道"——慢速学习者往往是最彻底的学习者;
- 不假装惊讶(No feigning surprise)——不要因为别人不知道某事而表现出惊讶;
- 不做"well-actually"式的挑刺纠正;
- 不"后座驾驶"(No back-seat driving)——别人正在解决问题时不要插嘴,除非对方求助;
- 不容忍任何形式的偏见(种族、性别、性取向等)。
这套准则源自 Recurse Center 手册,其核心是营造一个纯粹面向"学习或教授 Haskell"的安全空间。指南也提醒:频道内若出现明显无意义的骚扰言论会收到警告。
四、核心学习路径:cis1940 → FP Course
指南将学习内容严格分层:核心推荐只有两条——cis1940 课程与 FP Course,其余全部是可选的"知道去哪找就行"的补充资源。
4.1 教材选项:Haskell Book 与免费替代
Haskell Book(《Haskell Programming from First Principles》)是作者团队自己撰写的教材,也是指南推荐列表的来源。指南特别说明:下文推荐的所有资源都是免费的;如果读者因任何原因买不起这本书,可以联系官方支持页面获取帮助。也就是说:付费与免费两条路并行,核心课程本身不依赖付费内容。
4.2 第一步:Yorgey 的 cis1940 课程(Spring 13)
先做这个!——指南将 cis1940 定位为免费入门 Haskell 的最佳选择。
cis1940 是 Brent Yorgey 在宾夕法尼亚大学开设的课程(spring 13 版本在线可获取)。指南给出它的两个核心价值:
- 不仅教你写出基础的 Haskell;
- 还帮助你理解parser combinators(解析器组合子)——这是 Haskell 函数式组合能力最经典的实战体现之一。
指南明确了一个例外:如果你完全不是程序员或经验不足,不要从 cis1940 开始,而应先用 Thompson 的《The Craft of Functional Programming》打底,再转入 cis1940。
4.3 第二步:FP Course(fp-course)
这是 cis1940 之后我们推荐做的课程。
FP Course 是托管于 GitHub 的开源练习课程(仓库名 fp-course),其价值在于:
- 亲手实现cis1940 中引入的抽象,而不是只读不练;
- 通过练习让你在日常编码中熟练使用 Functor / Applicative / Monad 等类型类——指南称之为"关键性的练习";
- 指南明确表示:"完成 cis1940 + FP Course 代表本指南的核心推荐,也是我们教所有人 Haskell 的方式。"
这条路径的定位可以理解为:cis1940 建立概念框架,FP Course 通过实现抽象把框架变成肌肉记忆。
4.4 第三步(可选补充):cs240h
完成前两门课之后,指南推荐的中级补充课程是cs240h——Bryan O'Sullivan 在斯坦福大学讲授的课程(在线提供 Spring 14 与 Winter 16 两个版本)。指南对这位作者的评价是:随便看一半 Haskell 应用最终需要的库,都能看到他的名字(Aeson、attoparsec 等高性能库均出自他手)。
对于已完成 Yorgey 课程的人,cs240h 特别值得关注的模块包括:
- phantom types(幻影类型);
- information flow control(信息流控制);
- language extensions(语言扩展);
- concurrency(并发);
- pipes(流式数据处理);
- lenses(镜头式嵌套访问/修改)。
五、特定主题资源:specific_topics.md 导览
指南指出,上述课程之外的资源"未经与课程同等程度的学习者验证",但它们被系统整理在 specific_topics.md 中,让你知道该从哪里开始查。该文件覆盖中高级概念、工具与编辑器等主题,以下是几个与学习路径衔接最紧密的板块:
5.1 语法糖与折叠
<-、do记法、列表推导的**脱糖(desugar)**机制;- 理解 list 与 fold 的经典视频教程;
- 常见类型类:
Functor、Applicative、Monad、Monoid等,推荐 Typeclassopedia 作为系统性参考。
5.2 惰性求值与受保护递归
specific_topics.md 附有一段可在 GHCi 中直接验证的演示,解释"受保护递归(guarded recursion)"与严格运算的区别:
let a = 1 : a -- guarded recursion, (:) 是惰性的,可以被模式匹配 let (v : _) = a > v 1 > head a -- head a == v 1 let a = 1 * a -- 不是受保护的,(*) 是严格的 > a *** Exception: <<loop>>同一个let a = 1 : a因为(:)惰性而能安全地取出头元素;1 * a因乘法严格而陷入无限循环。这是理解 Haskell 惰性求值与 WHNF/NF 等概念的入门演示。
5.3 Monad 与 Monad Transformers
该板块给出了一条重要的学习顺序警告:在理解 typeclass、Monoid、Functor、Applicative 之前,不要碰 Monad。推荐的练习方式包括:
- 自己实现标准库中的 Monad(List、Maybe、Cont、Error、Reader、Writer、State)来加深理解;
- 使用 Monad Transformers Step by Step 论文,为一个小的表达式语言编写 monadic 解释器;
- 通过"只更换 Monad 就改变解释器语义"来体会抽象的作用;
- 重写
Control.Monad中的mapM、sequence等泛型 monadic 函数。
5.4 解析、测试与数据处理
- 解析:Parsec 的 parser combinator 教程;JSON 解析与生成以Aeson为标准方案;
- 测试:Kazu Yamamoto 的单元测试教程、生成式/属性测试、Simple-Conduit(理解流式 IO);
- 数据分析:仓库另有 libraries.md,按 "Haskell 版 Numpy/pandas/Matplotlib" 的思路整理了 accelerate、repa、hmatrix(BLAS/LAPACK 绑定)、tables、diagrams、IHaskell(跑在 iPython 内的笔记本)以及 cassava、pipes-csv 等 CSV 处理库。
5.5 开发环境与工具链
- 编辑器:Emacs、Vim(haskell-vim-now、ghc-mod、hindent)、Sublime Text(SublimeHaskell);
- Hoogle 与 Haddock:Hoogle 可按类型签名搜索函数,例如搜索
(a -> b) -> [a] -> [b]即可定位map及其变体;配置本地 Hoogle 实例、让 Haddock 生成关联包文档(需在~/.cabal/config中设置documentation: True)的细节都在 specific_topics.md 中; - Cabal 使用规范:始终用沙箱(sandbox)安装新包;用
cabal repl启动项目作用域的 ghci;构建出问题时可考虑 Stackage 快照。
六、对话记录 dialogues.md:真实问答中的进阶养分
指南特别强调 dialogues.md "实际上相当重要且有帮助",它收录了 IRC 频道与其他场合的真实讨论,适合在完成核心课程后做主题式深潜。以下挑几段能体现"如何像 Haskeller 一样思考"的典型内容:
6.1 Transducers:从 foldl 的类型签名出发
edwardk 现场推演了 transducer 的本质:它不过是把foldl的类型(b -> a -> b) -> b -> [a] -> b中的列表部分抽象掉,得到
type Transducer a b = forall r. (r -> b -> r) -> r -> a -> r于是foldl :: Transducer [a] a,tmap f g r = g r . f定义映射型 transducer,(\f g r -> foldl g r . f) :: (a -> [b]) -> Transducer a b则给出 concatMap 式的 transducer。这段讨论展示了从类型签名倒推抽象的思维方式。
6.2 State Monad vs. fold
一位学习者困惑"何时该用 State Monad,何时该用 fold"。John Wiegley 的回答很精辟:把foldr的参数重新排列为(a -> b -> b) -> [a] -> b -> b,并想象State b ()动作,即可写出
foldrS :: MonadState b m => (a -> m ()) -> [a] -> m ()这与mapM_在本质上等价:
foldr f b xs execState (mapM_ f' xs) b差别只在f与f'的类型。结论是:二者等价,选哪个取决于是否想引入 monad;作者倾向于用 fold 保持"函数与值的层面",同时建议把这些同构关系记在心里,以便随时切换表达方式。
6.3 $ 与 . 运算符的本质
对话用lambdabot现场验证了运算符定义:
f $ x = f x,$是infixr 0(右结合、优先级最低);.就是函数复合:(.) :: (b -> c) -> (a -> b) -> a -> c;- 因此
f = c . b . a $ x与f = c . b . a完全等价(point-free 化); foo $ bar $ baz等价于foo (bar (baz))。
6.4 纯函数数据结构与复杂度
一位从 C 移植算法的学习者问:Haskell 的last/init是 O(n),能否做到 O(1)?Richard A. O'Keefe 的回答点破了关键:Haskell 列表是单链表,任何语言下都不可能在不换数据结构的前提下让"从尾部删除"变成 O(1);正确做法是换数据结构——Data.Sequence(finger tree,摊销 O(1) 的 snoc/unsnoc、O(log n) 随机访问,代价是无法表达无限列表)、realtime queue、skew binary random access list、difference list(O(1) append,但反复"构造-检查"交替会伤渐进复杂度)等各有取舍。这段讨论的价值在于:先认清数据结构的权衡,再谈性能。
6.5 其他高频主题
dialogues.md 还收录了 CPS 变换、Writer monad 的listen、free monads 的起源、rank-2/rank-N 类型与类型推断、函数类型a -> b的基数为何是b^a、Applicative 的liftA2、RankNTypes 的 CPS 例子,以及"Functor 是一个代数"的完整论证(含instance Functor ((->) r)的经典实现)。
七、仓库内的配套使用方式
- 生成 PDF:仓库 Makefile 提供了基于 pandoc 的转换目标——
make pdf将 README.md 输出为tutorial.pdf,make pdf-lang GUIDE_LANG=id可将印尼语版 guide-id.md 输出为tutorial-id.pdf,make dialogues则将 dialogues.md 转为 PDF,方便离线阅读; - 版本对照:guide-id.md 是 README.md 的翻译版,个别信息存在滞后(如 IRC 网络仍写 Freenode,英文版已迁移至 Libera Chat),阅读时以 README.md 为准;
- 参与约束:仓库为只读镜像,学习过程中只需查看、安装与运行,无需修改仓库内容。
八、总结:一条可立即执行的路线图
把 guide-id.md 的全部建议压缩成一张行动清单:
- 装工具:安装 Stack(不要装 Haskell Platform),用它管理 GHC 与项目;
- 进社区:加入
#haskell-beginners(Libera Chat)与邮件列表,先读 coc.md 了解频道规范; - 走核心路径:完成 cis1940(Spring 13)全部讲义与作业 → 完成 FP Course 的全部练习;非程序员先以 Thompson 的书打底;
- 按需进阶:有余力再学 cs240h(phantom types、信息流控制、语言扩展、并发、pipes、lenses);
- 按主题查资料:遇到具体概念(惰性求值、Monad transformer、解析、测试、编辑器配置、Hoogle/Haddock)时,回到 specific_topics.md 按目录检索;
- 用对话深化理解:学有余力时通读 dialogues.md,在真实问答中体会类型驱动、抽象重构的 Haskell 思维方式。
最后回到指南的箴言:不要纠结暂时不懂的东西,继续前进。先用 cis1940 和 FP Course 把 Functor/Applicative/Monad 变成日常工具,再回来填补理论——这正是这份经验指南给出的最快路径。
- 教程
【免费下载链接】learnhaskell
Learn Haskell
相关推荐
Learn Haskell 学习路线实战指南:从 cis1940 到 FP Course 的完整学习路径(基于 learnhaskell 仓库)
Learn Haskell 学习路线实战指南:从 cis1940 到 FP Course 的完整学习路径(基于 learnhaskell 仓库) 本文以 lea
教程learnhaskell 仓库 Haskell 学习路线指南:从 Stack 安装到 cis1940 与 FP 课程的系统路径
learnhaskell 仓库 Haskell 学习路线指南:从 Stack 安装到 cis1940 与 FP 课程的系统路径 本指南以 learnhaskel
教程learnhaskell 仓库 Haskell 学习路线全指南:从 Stack 安装到 cis1940 与 FP 课程的系统进阶路径
learnhaskell 仓库 Haskell 学习路线全指南:从 Stack 安装到 cis1940 与 FP 课程的系统进阶路径 本指南以 learnhas
教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考