我喜欢GHC手册中的例子.这很简单,它说明了一些关键点:
GADT允许您使用Haskell的类型系统来模拟您正在实现的语言的类型系统("对象语言")
这允许Haskell的静态检查断言你的"编译器通过"或什么不是类型保留.采用对象语言术语的函数可以假设这些术语是良好类型的.返回对象语言术语的函数需要生成类型良好的术语.
匹配GADT构造函数的模式会导致类型细化. eval有Term a -> a整体类型,但右侧eval (Lit i)有has类型Int,因为左侧构造函数有类型Term Int.
Haskell系统不关心你给GADT构造函数的类型.我们可以很容易地使每个构造函数都data Term a给出类型的结果Term a,或者Term Bool,data定义仍然会经历.但我们无法写作eval :: Term a -> a.您可以选择GADT"标记类型"来模拟您的问题,以便您想要编写的有用函数是良好类型的.
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |