☰
learnhaskell 学习路线指南:以 cis1940 与 FP Course 为核心的系统化 Haskell 入门路径
2026/9/26 13:16:04 网站建设 项目流程
  • 教程

【免费下载链接】learnhaskell

Learn Haskell

项目地址:https://gitcode.com/gh_mirrors/le/learnhaskell
点击查看免费下载

本文围绕 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 版本在线可获取)。指南给出它的两个核心价值:

  1. 不仅教你写出基础的 Haskell;
  2. 还帮助你理解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 的全部建议压缩成一张行动清单:

  1. 装工具:安装 Stack(不要装 Haskell Platform),用它管理 GHC 与项目;
  2. 进社区:加入#haskell-beginners(Libera Chat)与邮件列表,先读 coc.md 了解频道规范;
  3. 走核心路径:完成 cis1940(Spring 13)全部讲义与作业 → 完成 FP Course 的全部练习;非程序员先以 Thompson 的书打底;
  4. 按需进阶:有余力再学 cs240h(phantom types、信息流控制、语言扩展、并发、pipes、lenses);
  5. 按主题查资料:遇到具体概念(惰性求值、Monad transformer、解析、测试、编辑器配置、Hoogle/Haddock)时,回到 specific_topics.md 按目录检索;
  6. 用对话深化理解:学有余力时通读 dialogues.md,在真实问答中体会类型驱动、抽象重构的 Haskell 思维方式。

最后回到指南的箴言:不要纠结暂时不懂的东西,继续前进。先用 cis1940 和 FP Course 把 Functor/Applicative/Monad 变成日常工具,再回来填补理论——这正是这份经验指南给出的最快路径。

  • 教程

【免费下载链接】learnhaskell

Learn Haskell

项目地址:https://gitcode.com/gh_mirrors/le/learnhaskell
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询