我开始在Haskell Wiki上阅读有关GADT的内容,但对它的理解却并不十分清楚。您是否建议为Haskell初学者解释GADT的特定书籍章节或博客文章?
答案 0 :(得分:16)
Apfelmus提出video tutorial for GADTs可能会有所帮助。
答案 1 :(得分:6)
我喜欢GHC manual中的示例。这很简单,它说明了一些关键点:
GADT允许您使用Haskell的类型系统来模拟您正在实现的语言的类型系统(“对象语言”)
这允许Haskell的静态检查断言你的“编译器通过”或者什么不是类型保留。采用对象语言术语的函数可以假设这些术语是良好类型的。返回对象语言术语的函数需要生成类型良好的术语。
模式匹配GADT构造函数会导致类型细化。 eval
总体上有Term a -> a
个类型,但eval (Lit i)
的右侧有Int
类型,因为左侧构造函数的类型为Term Int
。
Haskell系统不关心你给GADT构造函数的类型。我们可以轻松地让data Term a
中的每个构造函数都给出Term a
或Term Bool
类型的结果,data
定义仍然可以通过。但我们无法写eval :: Term a -> a
。您选择GADT“标记类型”来模拟您的问题,以便您想要编写的有用函数是良好类型的。
答案 2 :(得分:1)
其他链接:
答案 3 :(得分:1)
Haskell wiki的GADTs for dummies是我见过的最佳解释。
我(以及我怀疑其他人)在大多数介绍中遇到的问题是,他们在语法方面展示了GADT的例子,在你理解GADT 之前,它是非显而易见的。这使得构建所有内容的最简单的示例特别难以完全理解 - 您可以猜测许多模式正在做什么,但理解每个语句的确切作用是具有挑战性的。
“for dummies”帖子在解释其自身基本示例的过程中剖析并建立语法的含义,这使得它成为一个更有用的起点。我强烈推荐它。