学习GADT的材料

时间:2010-10-26 00:14:21

标签: haskell gadt

我开始在Haskell Wiki上阅读有关GADT的内容,但对它的理解却并不十分清楚。您是否建议为Haskell初学者解释GADT的特定书籍章节或博客文章?

4 个答案:

答案 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 aTerm Bool类型的结果,data定义仍然可以通过。但我们无法写eval :: Term a -> a。您选择GADT“标记类型”来模拟您的问题,以便您想要编写的有用函数是良好类型的。

答案 2 :(得分:1)

答案 3 :(得分:1)

Haskell wiki的GADTs for dummies是我见过的最佳解释。

我(以及我怀疑其他人)在大多数介绍中遇到的问题是,他们在语法方面展示了GADT的例子,在你理解GADT 之前,它是非显而易见的。这使得构建所有内容的最简单的示例特别难以完全理解 - 您可以猜测许多模式正在做什么,但理解每个语句的确切作用是具有挑战性的。

“for dummies”帖子在解释其自身基本示例的过程中剖析并建立语法的含义,这使得它成为一个更有用的起点。我强烈推荐它。