learnhaskell 意大利语指南(La Guida)全解析:从工具链安装到进阶主题的完整 Haskell 学习路线
教程【免费下载链接】learnhaskellLearn Haskell项目地址https://gitcode.com/gh_mirrors/le/learnhaskell点击查看免费下载本篇技术指南以开源仓库 learnhaskell 中的意大利语版学习指南 guide-it.mdLa Guida为骨架结合仓库内 README.md、install.md、specific_topics.md、tools.md、dialogues.md、write_haskell_as_fast_as_c.md 等文档与素材系统梳理该指南推荐的 Haskell 学习路径从 GHC/Cabal 工具链在各平台上的安装配置到 cis1940 → FP course → cs240h 三门主修课程再到惰性求值、IO、Monad、解析、图算法、Cabal 工作流、Hoogle/Haddock、前端编译等专题资源。读完本文你将掌握该指南推荐的完整学习顺序、可在各主流操作系统上复现的工具链安装步骤以及每个学习阶段对应的核心概念与实战练习方法。一、指南背景learnhaskell 仓库与 La Guida 的定位learnhaskell 仓库的 README.md 开篇即说明这是一条基于帮助他人学习的经验总结出来的 Haskell 推荐学习路径推荐清单出自 Haskell Book 的作者之一仓库维护者 bitemyapp。该 README 提供了包括意大利语在内的 17 种语言版本而本篇文章的核心对象——guide-it.md——正是这份指南的意大利语译本标题为 La Guida意即指南。指南开头给出一条贯穿全文的忠告一个建议不要为第一遍读不懂某些内容而焦虑。继续往前走。这句话是理解整个学习路径的关键方法论Haskell 的概念惰性求值、Monad、Typeclass 等往往需要多轮反复阅读才能真正内化指南刻意采用先过一遍、后续专题再深入的螺旋式结构。除主学习路径外仓库还配套维护了若干延伸材料可作为本篇的交叉参考specific_topics.md具体主题资源清单覆盖语法糖、惰性求值、IO、Monad、解析、图算法、开发环境、性能优化、元编程等tools.md开发工具清单编辑器配置、构建命令等dialogues.md来自 IRC 频道及其他场合的技术对话记录如 Transducers、State monad 与 fold 的取舍等共 1431 行write_haskell_as_fast_as_c.mdDon Stewart 关于利用严格性与递归写出媲美 C 语言性能的 Haskell 代码的经典文章tony_parametricity.pdfTony Morris 关于参数化parametricity的演示文稿Makefile通过 pandoc 将 README/多语言指南/dialogues 编译为 PDF 的脚本其中pdf-lang目标用GUIDE_LANG变量控制输出对应语言版本例如make pdf-lang GUIDE_LANGit可生成意大利语版 PDF。二、工具链基础Haskell、GHC 与 Cabal 分别是什么在动手安装之前指南首先厘清三个常被混为一谈的概念与 install.md 中英文版表述一致Haskell一门编程语言其语言规范以报告report形式发布最近一次发布为 2010 年Haskell 2010。GHC使用 Haskell 最主流的工具套件不仅包含编译器还自带 REPL交互式解释器即 GHCi、包与库管理能力以及其他工具。Cabal负责 Haskell 项目管理和依赖解析的软件是安装包的工具指南撰写时期典型做法是每个包装进自己的 sandbox。指南用主流语言生态的包管理器做类比Cabal 之于 Haskell相当于 Ruby 的 Bundler、Python 的 pip、Node 的 NPM、Java 的 Maven。关键在于分工GHC 自己负责打包管理Cabal 负责决定安装哪个版本。版本前提与仓库现状需要特别说明的是guide-it.md 与 install.md 中记录的安装命令反映的是指南撰写时期2014 年前后的版本组合如ghc-7.8.3、cabal-install-1.20、Fedora 21、Mac OS X 10.6–10.9。而仓库当前的 README.md 已明确推荐改用Stack来安装 GHC 并构建项目并专门以 DO NOT INSTALL HASKELL PLATFORM 一节告诫读者不要遵循 Haskell.org 上的 Haskell Platform 安装方式install.md 首行也标注 These instructions are deprecated这些指令已过时仅保留给需要最小化安装的读者。因此阅读下文各平台的安装命令时请把它们当作历史命令参考同时知晓当前仓库推荐的最新路径是 Stack。三、工具链安装实战各平台完整命令指南按操作系统给出了完整的安装步骤。以下逐一复现均来自 guide-it.md 原始命令并保留注释Ubuntu指南推荐使用 hvr 的 GHC PPA作者称其在所有 Linux 开发与构建机上使用该 PPA$ sudo apt-get update $ sudo apt-get install python-software-properties # v12.04 及以下版本 $ sudo apt-get install software-properties-common # v12.10 及以上版本 $ sudo add-apt-repository -y ppa:hvr/ghc $ sudo apt-get update $ sudo apt-get install cabal-install-1.20 ghc-7.8.3 happy-1.19.4 alex-3.1.3随后将以下路径前置到你的$PATH中写入 bash_profile、zshrc、bashrc 等配置文件~/.cabal/bin:/opt/cabal/1.20/bin:/opt/ghc/7.8.3/bin:/opt/happy/1.19.4/bin:/opt/alex/3.1.3/bin可选也可以把.cabal-sandbox/bin加入 path这样你正在开发中的代码可直接从命令行调用但该目录仅在当前工作目录处于 cabal sandbox 内时有效。注意命令中一并安装了happy与alex——它们是 Haskell 生态中的两个生成器工具happy 是 LALR 解析器生成器alex 是词法分析器生成器许多基础包的构建都依赖它们。Debian借助 Ubuntu PPA如果使用的不是 Debian stable可遵循与 Ubuntu 相同的步骤但需多执行一条命令。在sudo add-apt-repository -y ppa:hvr/ghc之后立即执行$ sudo sed -i s/jessie/trusty/g /etc/apt/sources.list.d/hvr-ghc-jessie.list其他 Debian 版本只需把上述命令中所有jessie替换为你所用版本的代号。若/etc/apt/sources.list.d/hvr-ghc-jessie.list文件不存在则/etc/apt/sources.list中应有一条形如以下的行deb http://ppa.launchpad.net/hvr/ghc/ubuntu jessie main将其中的jessie替换为trusty即可。手动编译可参考一份面向 Mac OS X 撰写的 platformless 指南关键注意点有二配置 ghc 时设置合适的前缀prefix不要直接下载cabal-install的二进制而是获取源码并运行bootstrap.sh脚本自行引导安装。Fedora 21从非官方仓库安装 Haskell 7.8.4Fedora 22 将把它纳入官方仓库$ sudo yum-config-manager --add-repo \ https://copr.fedoraproject.org/coprs/petersen/ghc-7.8.4/repo/fedora-21/petersen-ghc-7.8.4-fedora-21.repo $ sudo yum install ghc cabal-install该 ghc 与 Fedora/EPEL 自带的 ghc不能并行安装。Arch Linux从 Arch 官方仓库直接安装$ sudo pacman -S cabal-install ghc happy alex haskell-haddock-libraryGentooGentoo 可通过 Portage 安装 Haskell Platform 的各个独立组件。若使用ACCEPT_KEYWORDSarch而非~archPortage 会安装较旧的 Haskell 版本因此若使用前者需在/etc/portage/package.accept_keywords中添加dev-haskell/cabal-install ~arch dev-lang/ghc ~arch然后执行$ emerge -jav dev-lang/ghc dev-haskell/cabal-installGentoo 的 Portage 树中保留的是稳定版读作老旧版cabal-install因此需要用cabal-install去安装更新版本。注意以下命令中的反斜杠是有意为之用于绕过 shell 的 alias 展开$ \cabal update # 反斜杠 $ \cabal install cabal-install # 都是有意为之至此 cabal 已通过 Portage 全局安装同时cabal-install也在 home 目录本地安装了新版。下一步要确保在终端里敲cabal时shell 调用的是 home 目录下的最新版本。在 shell 配置文件中加入PATH$PATH:$HOME/.cabal/bin alias cabal$HOME/.cabal/bin/cabal如果不确定自己用哪种 shell可用以下命令查询echo $SHELL | xargs basename作者用 zsh该命令输出zsh。使用 Bash 则编辑~/.bashrc使用 Z-shell 则编辑~/.zshrc。最后再安装附加工具alex和happy$ cabal install alex happy至此一套可用的 Haskell 安装便告完成。Mac OS X10.9安装 GHC for Mac OS X 应用其自带 GHC 与 Cabal把.app放到磁盘任意位置后按其说明将 GHC 与 Cabal 加入 path 即可。10.6–10.8使用对应的二进制发行版 tarball 按二进制安装方式执行对应 2014.2.0.0 版本的 ghc-7.8.3 x86_64 tarball。Windows可使用 GHC 的最小化 Windows 安装器它能够编译network等库虽处于 beta 阶段但对本指南读者而言应足够使用。务必以管理员身份运行安装器因为安装过程需要访问系统 Program Files 目录。其他 Linux 用户直接下载 GHC 与 Cabal 最新的二进制发行版GHC 从官方页面获取Cabal 从 Cabal 下载页获取。四、主修课程指南推荐的三步学习路径指南的核心推荐是一条明确的三阶段路线这也是整个仓库的灵魂所在README.md 中对 cis1940 与 FP course 的表述与之完全一致。1. Brent Yorgey 的 cis1940 课程——第一个必学课程先学这个这是指南推荐给 Haskell 初学者的第一门课。这是作者目前找到的最好入门课程价值不仅在于让你能写出基础 Haskell 代码更在于帮助你理解parser combinator解析器组合子。唯一不适合用它起步的情况你不是程序员或编程经验很少。此时建议先读 Thompson 的 Haskell 教材再过渡到 cis1940。2. FP 课程——cis1940 之后紧接着学这是 Yorgey cis1940 之后推荐学习的课程。FP course 会直接要求你亲手实现 cis1940 中引入的各种抽象这种实践对熟练运用 Haskell 日常使用的Functor / Applicative / Monad等类型类至关重要。指南明确表示先 cis1940 再 FP 课程是这份指南的核心推荐也是我们教所有人学 Haskell 的方式这一表述同样出现在 README.md 中。3. 补充课程 cs240h——中等难度的进阶主题提供更多中等难度主题的材料。这是 Bryan OSullivanGitHub 上以 bos 著称在斯坦福授课的在线课程。作者打趣说如果你不认识他随便看一半 Haskell 项目所需的库上面都有他的名字。若已学完 Yorgey 课程cs240h 中特别值得关注的主题模块包括phantom types幻影类型、信息流控制、语言扩展、并发、pipes 库和 lenses 库。三门课程的参考书两本可在线阅读的经典参考书被并列推荐Learn You a Haskell for Great GoodLYAH轻松风格入门读物Real World HaskellRWH作者推荐用作参考书书很厚其中关于解析parsing和 Monad的章节对理解 Monad 的实际用途极有帮助适合掌握 Haskell 基础后按实际场景继续学习惯用写法。配套概念答疑资源针对 Haskell 学习中常见的三个卡点指南分别给出推荐-/do/ list comprehension 这些语法糖到底做了什么可查阅关于如何脱糖desugarHaskell 代码的专题文章理解 list 与 fold可观看 Explain List Folds to Yourself 讲解视频理解常用 TypeclassFunctor、Applicative、Monad、Monoid等可参考 Haskell Wiki 的Typeclassopedia其中还包含 Hask 范畴与范畴论特定信息读懂 Haskell 常见报错可参考关于理解 Haskell 基础错误消息的 PDF 论文。五、惰性求值、严格性与受保护递归一次可复现的最小演示指南用一段可以在 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解读1 : a中列表构造子(:)对第二个参数是惰性的因此可以无限制地对a做模式匹配取头元素head a与v都得到1而1 * a中乘法运算符(*)对参数是严格的求值a会陷入无限自引用GHC 运行时报出*** Exception: loop。这段演示同样收录于 specific_topics.md 的 Laziness, strictness, guarded recursion 一节。指南为深入理解补充的材料包括Simon Marlow 的并行与并发编程书中对**惰性求值与 normal form范式**最好的入门章节之一作者称如果需要更多材料请结合其他资料关于惰性求值的多篇技术文章More points for lazy evaluation、Oh my laziness!关于 Haskell 是否有惰性求值 的 Stack Overflow 讨论涉及尾递归优化的话题Johan Tibell 关于推理惰性求值的演示文稿。仓库内的纵深案例惰性导致的内存爆炸若想看到惰性求值在真实性能问题中的影响仓库内的 write_haskell_as_fast_as_c.md 提供了一个经典案例Don Stewart 2008 年文章用声明式代码计算 1e9 个双精度浮点数的均值import System.Environment import Text.Printf mean :: [Double] - Double mean xs sum xs / fromIntegral (length xs) main do [d] - map read fmap getArgs printf %f\n (mean [1 .. d])以ghc -O2 --make编译后运行./A 1e9程序在约 13 秒后因内存耗尽而崩溃请求 1e9 个 Double 直接分配约 7.5GB外加 list 节点与指针的额外开销。这篇文章随后展示通过理解严格性与惰性的相互作用、改用受保护的递归/严格折叠等写法Haskell 代码可以稳定地达到与高度优化的 C 竞争的性能——这正是 guide-it.md 在 GHC Core 与性能优化 一节中把该文列为第一推荐的原因。六、IOstate token、惰性语言与副作用指南为理解 IO 给出四个递进层次的阅读材料求值顺序与 State token解释 GHC 如何通过世界令牌state token串联副作用解开 IO monad 之谜从类型系统角度剖析 IO 的抽象机制一等公民语句first class statementsSystem.IO.Unsafe.unsafePerformIO的 Haddock 文档阅读其文档及unsafeDupablePerformIO的实现注释。指南还引用了 Reddit 用户glaebhoerl的一段精辟评论点出 IO 设计背后的核心矛盾有趣的一点GHC 必须把 state token 的表示隐藏在抽象 IO 类型之后因为 state token 必须被线性使用不可复制、不可丢弃而类型系统无法保证这一点。Clean——另一门类似 Haskell 的惰性语言——拥有uniqueness types唯一性类型与线性类型相似可能在作者未知的方面有差异它直接暴露 world-passing并仅为方便起见提供一个非抽象的IO monad。这段评论解释了为什么 Haskell 选择抽象 IO 类型这一设计而非像 Clean 那样把世界传递直接暴露给程序员。七、Monad 与 Monad transformer先动手实现再谈理解指南给 Monad 学习设定了严格的前置条件并给出实现驱动的学习法在理解 typeclass、Monoid、Functor 与 Applicative 之前不要开始学 Monad学习步骤亲手实现标准库中的 MonadList、Maybe、Cont、Error、Reader、Writer、State——逐一自己实现以加深理解写一个 monadic 解释器参照 Monad Transformers Step by Step 论文为一个小型表达式语言编写基于 Monad 的解释器体会换 Monad 即换语义写多个仅通过更换 monad 来改变语义的解释器这会直观地传达 Monad 的作用机制重实现Control.Monad像mapM、sequence这样的函数是练习编写通用 monadic 代码的好机会以 FP 课程为向导上述过程可借助 FP course 推进其中还包含自己编写 Applicative typeclass 的练习。Monad transformer 专题可参考 A gentle introduction to Monad Transformers以及 Monad Transformers step-by-step注意其中代码较陈旧。八、测试、属性测试与解析测试与流式 IOKazu Yamamoto 的单元测试教程被指南盛赞为fantastico极好simple-conduit库适合以简单方式学习流式 IOstreaming IO一般原理的优秀库所学知识可迁移到 Pipes 与 Conduit 等更复杂的库。解析Parsing基于Parsec的解析器组合子入门教程手写一个微缩版 Parsecmicro-Parsec的练习文章——通过自己实现来理解 monadic parser 的内部机制。解析与生成 JSONAeson是 Haskell 中标准的 JSON 解析方案可在 Hackage 与官方 GitHub 仓库获取。指南推荐的学习资料覆盖用 Aeson 解析 JSON、Aeson 与用户自定义类型、用 Aeson 与 sum types 解析非确定性数据以及 Aeson 入门教程。九、图算法与数据结构指南为图论主题整理了一份完整资源清单fgl 包纯函数式最短路径算法参考其 Data-Graph-Inductive-Query-SP 模块归纳图inductive graphs与函数式图算法Erwig 的经典论文fgl 库正是基于归纳图思想实现FGL/Haskell——函数式图库早期论文 PDFcontainers 包的Data.Graph源码可用于阅读标准库图实现graphs 包**PHOAS参数化高阶抽象语法**相关讨论与 PHOAS for free 文章Tying the Knot打结Haskell 经典惰性技巧用于构造循环数据结构dag 包有向无环图。十、开发环境Emacs、Vim、Sublime TextEmacsAlejandro Serras 的 Emacs Haskell 教程作者bitemyapp自己的 dotfilesChris Done 的 Emacs 配置。VimHaskell Wiki 的 Vim 页面haskell-vim-now一键式 Vim Haskell 环境GHC-Mod及其 Vim 插件提供类型信息与补全HindentHaskell 代码格式化工具。Sublime TextSublimeHaskell插件。仓库内 tools.md 对开发环境补充了更贴合当前工具链的建议初学者不要安装或使用 ghc-mod脆弱、缓慢、不值得折腾Emacs 用户可安装 haskell-mode 与 flycheck并确保 flycheck 能找到 StackVim 用户可参考以下替代 ghc-mod 的可靠报错方案将 Stack 构建输出接入 Vim 的 errorformatautocmd FileType haskell setlocal makeprgstack\ build autocmd FileType haskell setlocal errorformat%f:%l:%v:%m此外 tools.md 还覆盖 Atomide-haskell、IntelliJintellij-haskforce、Notepad内置基础支持与 gedit内置基础支持等编辑器。十一、Cabal 实战规避 Cabal Hell 的工作流Cabal 使用准则指南指出在 sandbox 机制出现之前Haskell 用户长期受困于Cabal HellCabal 依赖地狱。若不在 sandbox 中安装cabal 会把包装进你的user package-db——这通常不是好主意例外只有少数基础包如 Cabal 本身、alex、happy。除非你清楚自己在做什么否则不应向 user 或 global package-db 安装任何其他东西。具体工作流建议想试验一个包或开启新项目时先在新目录执行cabal sandbox init安装新包、构建新项目或已有项目、开始实验时始终使用 sandbox使用cabal repl启动项目作用域project-scoped的 GHCi 实例而不是裸的 ghci。指南特别警告基于 sandbox 的做法能规避包依赖问题但与 Haskell Platform 预编译包的提供方式不兼容。因此如果你仍在学习 Haskell 且不理解 ghc-pkg 与 Cabal 的运作方式请避开 Haskell Platform改用指南开头的安装步骤在当前仓库语境下即改用 Stack。Stackage所有遇到构建问题的用户通常是 Yesod 用户可以考虑 Stackage。作者观点认为Stackage通常比cabal freeze更有用。十二、Hoogle 与 Haddock按类型搜索与文档生成按类型签名搜索代码Hoogle搜索引擎支持按类型签名搜索函数。指南给出的示例是搜索(a - b) - [a] - [b]这一签名即map的类型其意义在于当你忘记函数名、只记得类型时Hoogle 能直接给出候选。此外还可使用FP Complete 托管的 Hoogle 实例Hayoo默认索引整个 Hackage 的搜索服务。搭建本地 Hoogle可通过作者提供的 gist 指南搭建本地 Hoogle 实例。Haddock两个必须知道的坑指南强调生成带相关包文档的 Haddock 文档时有两个关键点documentation: True若要让 haddocks 包含相关包的文档必须在~/.cabal/config中设置documentation: True。若保持默认值False或被设为False则重新生成文档前必须删除全部包并重装。$pkg参数必须单引号包裹由于$pkg参数是由cabal 自身而非你进行插值的html-location与content-location参数必须用单引号包裹且要放在 shell 中或 shell 脚本里执行它们在 Makefile 中无法工作——因为 Make 会把$pkg当作自己的变量可复制的 shell 脚本写法可去掉反斜杠写成一行#! /usr/bin/env sh # 可去掉反斜杠写成一行 cabal haddock --hoogle --hyperlink-source \ --html-locationhttp://hackage.haskell.org/package/$pkg/docs \ --contents-locationhttp://hackage.haskell.org/package/$pkg十三、CI 与前端TravisCI、Haste、GHCJS、PureScript持续集成若使用 TravisCI指南强烈推荐以 multi-ghc-travis 作为项目travis.yml的基础——它支持在 CI 中测试多个 GHC 版本组合。前端 / JavaScript 三大方案指南直言前端方案选择多到奢侈推荐三条主线HasteHaskell 到 JavaScript 的编译器。其编译器仓库位于 GitHub另有一篇配合示例项目的优秀 Haste 入门演示涉及用 Haskell 写 Web 应用。GHCJS另一个 Haskell→JS 编译器。配套资料包括 GHCJS 入门、用 GHCJS 与 Sodium 构建函数式响应式 Web 界面、以及用 GHCJS 编写 Atom 插件。PureScript并非严格意义的 Haskell与 Haste、GHCJS 不同但在 Haskeller 中很受欢迎它由 Haskell 编写、受 Haskell 启发可在浏览器在线体验且有详尽的入门指南。如何选择前端语言代码共享GHCJS 与 Haste 都是完整 Haskell可前后端共享代码PureScript 不是 Haskell无法与后端直接共享代码。包兼容性GHCJS 能使用的 Haskell 包比 Haste 更多但对多数前端项目影响不大。运行时体积GHCJS 的运行时负载最大约 100kb作者 luite 正在优化Haste 与 PureScript 不相上下。工具链生态PureScript 与 JS 工具链gulp/grunt/bower集成最佳GHCJS 与 Haste 则与 Haskell 工具链Cabal集成更好。三者都是优秀选择可胜任绝大多数前端项目。十四、进阶主题速览性能、类型理论、递归模式与其他指南在主修课程之外整理了大量进阶专题以下按章节浓缩呈现惰性求值、范式与 WHNF 的深层理解Lambda 演算笔记多篇惰性 lambda 演算研究论文call-by-need lambda 演算、Lambda 演算归约演示、惰性 lambda 演算、Haskell 惰性求值等。并行 / 并发Simon Marlow 的《Parallel and Concurrent Programming in Haskell》被作者评为读过的最好的并行并发主题书一篇完整的 Haskell 多线程应用测试与增量开发 walk-throughFunctional Reactive ProgrammingFRP专题。Lenses 与 Prisms熟悉 Haskell 后强烈建议学习 Lens/Prism即使只作为使用者也不必先弄懂底层范畴论人们对 Lens 难度的估计普遍过高只要熟悉 Functor/Foldable/Traversable哪怕只熟悉第一个就能受益一个直觉提示如果你写过(fmap . fmap)你其实已经在用lens 式思维了推荐两份入门一份 lens 入门教程以及 Lens: Lenses, Folds and Traversals 说明文档更多信息见 Hackage 的 lens 包。递归模式Recursion Schemes那些以*-morphism结尾的怪词其实都在讲递归。前置要求会为 list 及至少一种数据结构如树实现foldrfold 即 catamorphism最好还能实现对应的 unfoldanamorphism。该主题与 Traversable、Foldable 相互贯通。推荐材料包括递归模式入门、Dont fear the cat演示 hylomorphism 即 cata 与 ana 的复合、Recursion Schemes 指南、Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire经典论文、Catamorphisms 专题。GHC Core 与性能优化仓库内文档 write_haskell_as_fast_as_c.md见本文第五章GHC Wiki 的 CoreSyn Type 注释Hackage 的 ghc-core 包关于如何阅读 GHC Core 的讨论Haskell as fast as C 博客文章《Real World Haskell》第 25 章Profiling and Optimizations。类型与范畴论指南明确标注写 Haskell 并不需要这些仅供感兴趣者学习Catsters Guide 系列byorgey 出品Haskell Wikibook 的范畴论章节含漂亮的示意图Haskell Wiki 的 Category Theory 页面Categories from scratch含实用示例Pierce 的 Great Works in PL 清单教科书Awodey 与 MacLane 的范畴论标准教材Harper 的《Practical Foundations for Programming Languages》PL 视角类型论最佳入门以及《Type theory and Functional Programming》。其他有趣主题参数化、ad-hoc 与参数多态、自由定理仓库内 tony_parametricity.pdf 提供相关演示另有其 TeX 源码配套文章包括 Making ad-hoc polymorphism less ad-hoc 与 Wadler 的经典论文 Theorems for Free!。Initial/Final、DSL、Finally Tagless涵盖 final encodings 演示、多态值变换、Haskell 98 中的 GADT、typed tagless-final 线性 lambda 演算、typed tagless-final 讲义等。ComonadComonads in Haskell 讲稿以及 Can a Monad be a Comonad 讨论。Yoneda / CoYonedaCoYoneda 的分步讲解Edward Kmett 的 Free monads for Less 三篇连载Part 1: Codensity、Part 2: Yoneda、Part 3: Yielding IO。命题 vs. 判断Propositions vs. JudgmentsStackExchange 讨论与 Martin-Löf 的三讲课程讲义。依赖类型Grokking sum types, value constructors, and type constructors用力眯眼去读Lightweight Dependent-type ProgrammingIdris 编程语言。静态链接二进制Haskell Wiki 的 Static linking 文献页在 Arch Linux 上使用 GHC 静态链接的实践针对 ARM 与 MIPS 的 Linux 静态链接讨论使用 GHC LLVM 静态链接 GMP 的讨论。对话集仓库 dialogues.md 收录了来自 IRC 频道等处的真实技术对话共 1431 行指南强调这些对话实际上相当重要且有用例如Transducers讨论edwardk 从foldl的类型签名(b - a - b) - b - [a] - b出发推导出 transducer 类型forall b. (b - y - b) - (b - x - b)并演示tmap、concatMap式的 transducer 与 lens 组合模式的关联State monad vs. fold讨论何时用 State Monad、何时用 fold 更合适的经典取舍问题。十五、社区与行为准则指南附带的社区信息与行为准则同样值得完整呈现仓库内的 coc.md 为英文版准则全文二者内容一致社区渠道IRC 频道#haskell-beginners位于 Freenode仓库 README.md 已更新为 Libera Chat附有 IRC Web 客户端入口以及 Haskell 官方邮件列表。准则要点源自 Chris Done 关于教学的文章以及 Recurse Center 手册友善、有礼貌粗鲁或刻薄的言行会吓跑他人、扼杀参与意愿不用心的廉价批评只对批评者有益对接收者无益不要用简单平凡banale之类的词形容事物——读者会因你口中琐碎的东西而自觉愚蠢往往学得慢的人学得更深这值得鼓励不要假装惊讶于某人不知道某件事——只会让对方难受而你自己除了自我感觉聪明外一无所获不要well, actually…式抬杠当某人说得几乎正确但不完全时你以其实……开头做小修正这非常令人恼火尤其当修正与对话无关时这并非说频道不追求真相或精确而是这种做法几乎总是出于炫耀而非求真不要后座驾驶back-seat driving看到别人在解决问题时不应频繁插嘴给建议除非对方明确求助否则让其自行摸索——避免打断是#haskell-beginners的创立宗旨之一零容忍各类主义种族主义、性别歧视、恐同、恐跨及其他偏见均不被欢迎。十六、总结一条可复现的 Haskell 成长路径纵观 guide-it.md 全文learnhaskell 仓库推荐的学习路径可归纳为一个清晰的闭环安装工具链按平台命令装好 GHC Cabal alex/happy在当前仓库语境下首选 README.md 推荐的 Stack三阶段主修cis1940入门→ FP course亲手实现抽象→ cs240h进阶主题全程以 LYAH 与 RWH 为参考书核心概念刻意练习用 GHCi 亲手验证惰性求值与受保护递归1 : avs1 * a亲手实现 List/Maybe/State 等 Monad 与Control.Monad中的mapM/sequence专题按需深入解析Parsec/Aeson、图算法fgl、测试、开发环境、Cabal sandbox 工作流、Hoogle/Haddock 文档生成、前端编译Haste/GHCJS/PureScript、性能GHC Core、类型理论等在社区中成长加入#haskell-beginners遵守行为准则并阅读仓库 dialogues.md 中的真实技术对话沉淀直觉。贯穿始终的是开篇那句忠告不要为第一遍读不懂而焦虑继续往前走——这既是学习 Haskell 的心态指南也是这份指南被设计成先整体扫过、再逐层深入结构的原因所在。赞分享教程【免费下载链接】learnhaskellLearn Haskell项目地址https://gitcode.com/gh_mirrors/le/learnhaskell点击查看免费下载相关推荐learnhaskell 德语版 Haskell 学习指南全解从工具链安装到 Monad、惰性求值与 GHC 优化的完整进阶路线learnhaskell 德语版 Haskell 学习指南全解从工具链安装到 Monad、惰性求值与 GHC 优化的完整进阶路线 导读 本文以 guide d教程学习 Haskell 完整指南基于 learnhaskell 仓库 guide-pt.md 的入门路线、工具链与进阶主题全解学习 Haskell 完整指南基于 learnhaskell 仓库 guide pt.md 的入门路线、工具链与进阶主题全解 本指南以 learnhaskel教程learnhaskell 项目《如何学习 Haskell》乌克兰语指南全解析从学习路线到工具链实战learnhaskell 项目《如何学习 Haskell》乌克兰语指南全解析从学习路线到工具链实战 本文以 learnhaskell 仓库中的 guide u教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考