发布时间:2026/8/17 19:10:59
组合扩展的威力:从haskell-exercises学习GADTs+DataKinds+TypeFamilies协同作战 组合扩展的威力从haskell-exercises学习GADTsDataKindsTypeFamilies协同作战【免费下载链接】haskell-exercisesA little course to learn about some of the more obscure GHC extensions.项目地址: https://gitcode.com/gh_mirrors/has/haskell-exercises学习 Haskell 时很多人都会遇到一个瓶颈普通类型系统已经用得很熟但面对GADTs、DataKinds、TypeFamilies这些 GHC 扩展却不知从何下手。haskell-exercises正是一套为这类学习者量身定制的练习课程它用一个接一个的微型项目带你把把错误挡在编译期这件事做到极致。本文将带你拆解这三个核心扩展并展示它们组合起来时的惊人威力。为什么单独学扩展很容易学废很多教程喜欢把扩展一个个单独讲但真实项目里它们几乎总是抱团出现。GADTs 给了你为每个构造器定制类型的自由DataKinds 让数据提升到类型层面TypeFamilies 则让类型本身可以计算。单独看每个都像是魔术组合起来才是真正的工程利器。haskell-exercises 的目录结构就是按扩展逐一组织的从01-GADTs一直到10-FunctionalDependencies每个练习目录都包含两个核心文件讲解版和练习版。例如01-GADTs/src/GADTs.hs是概念讲解而01-GADTs/src/Exercises.hs则是留给你的填空题答案藏在answers分支里。第一块拼图GADTs 让类型参数活起来 普通代数数据类型ADT有个限制所有构造器必须返回同一个类型。而广义代数数据类型GADTs打破了这个规则——每个构造器可以精确指定自己的返回类型还能在构造器里携带约束。看一个经典例子来自01-GADTs/src/GADTs.hsdata ShowList where ShowNil :: ShowList ShowCons :: Show a a - ShowList - ShowList这里ShowCons里藏着一个存在类型a它可以是任意类型只要实现了Show。于是你可以写出ShowCons Tom (ShowCons 25 (ShowCons True ShowNil))这种混合类型的列表——类型不同没关系只要都能被show出来就行。GADTs 另一个惊人能力是让类型检查器帮你排除不可能。同一个文件中MysteryBox和HList练习展示了当模式匹配某个构造器时GHC 能自动知道其他分支不可能发生从而允许你写出不需要 Maybe 的 total function。第二块拼图DataKinds 把数据升维到类型层 如果说 GADTs 是类型参数根据构造器变化那 DataKinds 就是值也能变成类型。打开04-DataKinds/src/DataKinds.hs你会看到一颗自然数的提升data Natural Zero | Successor Natural开启DataKinds后Natural同时成为一个kindZero和Successor变成类型层面的构造器。更妙的是我们可以用它给列表装上长度data Vector (length :: Natural) (a :: Type) where VNil :: Vector Zero a VCons :: a - Vector n a - Vector (Successor n) a于是长度信息被写进了类型head函数不再需要Maybe——因为类型为Vector (Successor n) a的值不可能是空列表。甚至zip函数原本需要四种情况匹配现在类型检查器能证明长度相等的两个向量要么都是空、要么都是非空代码直接砍掉一半分支。第三块拼图TypeFamilies 让类型也会计算 ➕06-TypeFamilies/src/TypeFamilies.hs只用了寥寥几十行就讲清楚了类型族TypeFamilies的本质类型层面的函数。type family Add (x :: Nat) (y :: Nat) :: Nat where Add Z y y Add (S x) y S (Add x y)这套递归定义和值层面的add函数几乎一一对应。类型族还能和单例类型singleton配合让根据输入类型决定输出类型成为可能。比如定义一个类型层面的Not就可以写出not :: SBool input - SBool (Not input)——布尔值翻转后类型也跟着翻转。协同作战1 1 1 3 的经典案例 ⚔️单独的扩展已经很强但真正震撼的是它们的组合。在04-DataKinds的练习里你可以构建一个异构列表 HList它把每个元素的类型都记录在类型层面在06-TypeFamilies的练习里则要求你用类型族写出类型层面的加减法、比较、甚至素数筛。最能体现三者合力的场景是用类型做协议/状态机。DataKinds 练习中有个著名的例子设计一个文件操作Program类型在类型层面记录文件当前是否打开文件未打开时ReadFile、WriteFile根本构造不出来未打开文件时调用CloseFile编译直接报错程序结束时类型保证文件必然已经关闭。这就是让非法状态不可表示make illegal states unrepresentable的威力——过去要靠运行时检查和测试才能发现的 bug现在编译器直接帮你拦下了。类似的还有 GADTs 练习里的类型对齐函数列表TypeAlignedList它保证函数列表里前一个函数的输出类型恰好等于后一个函数的输入类型拼出composeTALs :: TypeAlignedList b c - TypeAlignedList a b - TypeAlignedList a c这样的安全组合。如何开始动手练习️这套课程的使用方式非常简单克隆仓库git clone https://gitcode.com/gh_mirrors/has/haskell-exercises进入任意练习目录例如01-GADTs/用cabal repl或stack repl进入交互环境也可以用ghcid -c stack repl实现保存即检查打开src/Exercises.hs把error Implement me!逐个替换成你的实现卡住时切到answers分支对照答案每个练习目录下的exercise*.cabal文件都已配置好所需的语言扩展你几乎不需要手动{-# LANGUAGE ... #-}专心解题即可。学习路线建议 ️如果你完全零基础建议按官方顺序推进先01-GADTs掌握存在类型与类型导向的模式匹配再03-KindSignatures理解 kind 的概念这是 DataKinds 的地基接着04-DataKinds体验类型层面的编程最后06-TypeFamilies学会类型计算。之后还有07-ConstraintKinds、08-PolyKinds等进阶扩展等你解锁。结语 ✨很多人觉得 Haskell 的进阶扩展华而不实但 haskell-exercises 用大量精心设计的练习证明当 GADTs、DataKinds、TypeFamilies 协同作战时你是在把程序员的直觉写成可编译的类型约束。编译通过的那一刻不仅意味着程序能跑更意味着你正在写的代码在逻辑上就是正确的。从复制仓库到写完第一道题整个过程可能只需要一个下午。但这一下午的收获会彻底改变你写类型的方式。【免费下载链接】haskell-exercisesA little course to learn about some of the more obscure GHC extensions.项目地址: https://gitcode.com/gh_mirrors/has/haskell-exercises创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/8/17 19:10:59

Agent 工具的按需加载(ToolSearch)

Agent 工具的按需加载(ToolSearch) 本文描述 ToolSearch 从"agent 绑定工具清单"到"将完整工具加载到 Agent 运行实例"的完整交互流程。ToolSearch 是 Agent 运行时默认绑定、始终可用的内置工具(设计为按需启用),LLM 通过它按需检索并加载业务工具;…

2026/8/17 19:05:59

Python元组操作全攻略:查询统计遍历和转换

元组的定义 元组(Tuple) 表示多个元素组成的序列,与列表类似,不同之处在于元组定义好后元素不能修改,常用于保存不同类型的数据。 元组有特定的应用场景,常用于存储一串信息,元素之间使用逗号分…

2026/8/17 20:06:05

搞懂零碳园区:光伏储能碳管理一套方案全部搞定

工业园区作为中国工业经济的核心载体,承载了超过80%的工业企业,贡献了全国约50%的工业总产值,同时也产生了约31%的碳排放。推动园区绿色低碳转型,对于实现国家“双碳”(碳达峰、碳中和)战略目标具有至关重要…

2026/8/17 20:01:05

老款Mac真的还能再战五年?OpenCore Legacy Patcher完整实测

老款Mac真的还能再战五年?OpenCore Legacy Patcher完整实测 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 苹果总是用系统更新给老Mac判"死…

2026/8/17 10:49:52

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 5:02:51

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/17 0:02:57

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:02:57

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 15:07:41

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/17 17:27:06

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/15 9:46:30

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…