|
|
1
16
Monad Reader issue 15 名为“冒险三单子”有一个很好的介绍提示单子连同一些现实的GADTs。 |
|
|
2
53
gadt是独立类型语言归纳族的弱近似,让我们从这里开始。 归纳族是依赖类型语言中的核心数据类型引入方法。例如,在Agda中,您定义如下的自然数
这不是很奇特,基本上和Haskell的定义是一样的
实际上,在GADT语法中,Haskell形式更为相似
Agda有能力表示Haskell程序员所不熟悉和陌生的各种类型。一个简单的是有限集的类型。这个
写得像
在这一点上,这应该是相当奇怪的。首先,我们指的是一个类型,它有一个正则数作为“type”参数。第二,不清楚这对我们意味着什么
现在这又奇怪了,因为“自然”的定义
我们可以研究它是关于什么的
这需要一些工作来理解,因此作为一个示例,让我们尝试构造一个类型的值
这让我们看到有两个居民,还演示了一点类型计算是如何发生的。特别是
准确的 构造函数的类型。这可能很无聊
或者,如果我们有一个更灵活的索引类型,我们可以选择不同的,更有趣的返回类型
特别是,我们滥用了基于 特别 使用了值构造函数。这允许我们将一些值信息反映到类型中,并生成更精细的指定(fibered)类型。
那我们能拿他们怎么办?好吧,用一点肘部润滑脂我们就可以了
produce
... 然后一个GADT将值反映到这些类型中。。。
... 然后我们可以用这些来建造
但请注意,我们已经失去了很多方便归纳家庭。例如,我们不能在类型中使用常规的数字文字(尽管在Agda中这在技术上只是一个技巧),我们需要创建一个单独的“type nat”和“value nat”,并使用GADT将它们链接在一起,我们也会及时发现,虽然Agda中的类型级数学是痛苦的,但这是可以做到的。在哈斯凯尔这是难以置信的痛苦,往往不能。
例如,可以定义
因此,gadt类似于依赖类型语言中的归纳族,这些语言较弱且笨拙。我们为什么要把他们放在哈斯克尔? 基本上,因为并非所有类型不变量都需要归纳族的全部表达能力,GADT在Haskell中的表达性、可实现性和类型推断之间选择了一个特殊的折衷。 一些有用的GADTs表达式示例如下 Red-Black Trees which cannot have the Red-Black property invalidated 或 simply-typed lambda calculus embedded as HOAS piggy-backing off the Haskell type system .
隐式隐藏
|
|
|
3
24
gadt可以提供比常规adt更强大的类型强制保证。例如,可以强制在类型系统级别平衡二叉树,如 this implementation 2-3 trees
每个节点都有一个类型编码的深度,它的所有叶子都位于这个深度。一棵树就是这样 使用GADTs。
这意味着在执行以下操作时
|
|
|
4
3
当我们定义
或
计算
|
|
|
5
2
http://en.wikibooks.org/wiki/Haskell/GADT GADT还用于实现类型相等: http://hackage.haskell.org/package/type-equality . 我找不到合适的论文来参考这种即兴的方法——这种技术已经很好地进入了民间传说。不过,它在Oleg的无标记输入中使用得相当好。例如,请参阅有关将编译键入GADTs的部分。 http://okmij.org/ftp/tagless-final/#tc-GADT |