阅读ghc 7.4后。预发行说明和Giving Haskell a Promotion论文,我仍然对你实际使用推广类型做了什么感到困惑。例如,GHC手册提供了有关提升数据类型的以下示例:
data Nat = Ze | Su Nat
data List a = Nil | Cons a (List a)
data Pair a b = Pair a b
data Sum a b = L a | R b
这些有什么用途?你能给(代码)例子吗?
答案 0 :(得分:8)
论文本身至少有两个例子:
“1。简介”说:“例如,我们或许可以确保[在编译时]所谓的红黑树确实具有红黑属性”。
“2.1提升数据类型”讨论长度索引向量(即具有编译时“索引越界”错误的向量)。
您还可以查看此方向的早期工作,例如:用于类型安全异构列表和可扩展集合的HList库。 Oleg Kiselyov有许多相关的作品。您还可以阅读有关依赖类型编程的工作。 http://www.seas.upenn.edu/~sweirich/ssgip/main.pdf有关于Agda中类型级计算的介绍性示例,但这些也可以应用于Haskell。
粗略地说,这个想法是列表的head
给出了更精确的类型。而不是
head :: List a -> a
它是
head :: NotEmptyList a -> a
后一个head函数比fomer更安全类型:它永远不能应用于空列表,因为它会导致编译器错误。
您需要类型级计算来表达NotEmptyList等类型。具有功能依赖性的类型类,GAGT和(索引)类型族已经为haskell提供了弱形式的类型级计算。你提到的工作只是在这方面进一步阐述。
有关仅使用Haskell98类型类的实现,请参阅http://www.haskell.org/haskellwiki/Non-empty_list。
答案 1 :(得分:2)
Nat
可以是例如用于构造数字向量,只有在长度相同的情况下才能添加,在编译时检查。