我应该首先尝试学习哪种GHC类型的系统扩展?

GHC有一个类型系统扩展的整个动物园:多参数类型类,函数依赖关系,等级n多态性,存在类型,GADT,类型族,范围类型变量等等,哪些可能最容易学习? 另外,这些功能是否以某种方式组合在一起,还是它们都是完全不同的用途,而且都是独立的想法?


一个很好的学习是ScopedTypeVariables ,因为它们对调试函数中的类型问题非常有用。 当我有一个令人困惑的类型错误时,我临时为函数中的每个表达式添加类型声明。 (通常你需要分解一些表达式来看看真正发生了什么。)这通常可以帮助我确定哪种表达式具有与我预期不同的类型。

TypeFamiliesMultiParamTypeClasses更强大,所以你不需要后者。 在使用类型系列时,通常还需要启用FlexibleContextsFlexibleInstances ,因此,您将以三种价格学到的三个编译指示。 FunctionalDependencies通常与MultiParamTypeClasses ,所以这是您现在可以忽略的一个。

GHC非常擅长告诉你何时需要启用Rank2TypesRankNTypes ,因此您可以稍后再推迟学习。

那些是我开始的那些。


编辑:删除了有关避免StandaloneDeriving转发的评论。 (我在想孤儿实例。)


请注意,我已经与Haskell一起工作了一些,我已经就此问题发表了一些我自己的看法。 的mhwombat的建议ScopedTypeVariables是好的。 现在通常是我开始编写Haskell模块时输入的第一个东西。 每当代码变得有点棘手时,我喜欢有很多类型签名来帮助我看看我在做什么,而这个扩展让我可以写出我不知道的东西。 它也可以显着改善类型错误。 当使用其他类型的系统扩展时,它似乎也是非常重要的。

直到我了解了一些关于依赖类型的编程语言之前,我并没有真正欣赏GADT。 注意我认为它们如何可以作为证明对象,以及它们如何受到类型索引的约束,真是太棒了。

GADTa与DataKinds一起工作得非常好, DataKinds可以生成有趣的类型索引,如列表和布尔值。 我现在可以做一些事情,比如表示一个索引列表与树高一样长,而不会使用高阶嵌套类型让自己疯狂。

我还没有探索多参数类型类和函数依赖关系。 然而,我已经开始欣赏爱德华·凯梅特的reflection库,它在它的界面中使用它们。

我已经学会了对重叠和不连贯实例的健康尊重,我的意思是我从不使用它们。 重叠的感觉有点像宏编程,差错错误信息,而不连贯的是疯了。

RankNTypes确实很强大。 这是很少需要的事情之一,但在需要时非常重要。

链接地址: http://www.djcxy.com/p/43071.html

上一篇: Which GHC type system extensions should I try to learn first?

下一篇: Equality constraints in Constraint kinds