我应该首先尝试学习哪种GHC类型的系统扩展?
GHC有一个类型系统扩展的整个动物园:多参数类型类,函数依赖关系,等级n多态性,存在类型,GADT,类型族,范围类型变量等等,哪些可能最容易学习? 另外,这些功能是否以某种方式组合在一起,还是它们都是完全不同的用途,而且都是独立的想法?
一个很好的学习是ScopedTypeVariables
,因为它们对调试函数中的类型问题非常有用。 当我有一个令人困惑的类型错误时,我临时为函数中的每个表达式添加类型声明。 (通常你需要分解一些表达式来看看真正发生了什么。)这通常可以帮助我确定哪种表达式具有与我预期不同的类型。
TypeFamilies
比MultiParamTypeClasses
更强大,所以你不需要后者。 在使用类型系列时,通常还需要启用FlexibleContexts
和FlexibleInstances
,因此,您将以三种价格学到的三个编译指示。 FunctionalDependencies
通常与MultiParamTypeClasses
,所以这是您现在可以忽略的一个。
GHC非常擅长告诉你何时需要启用Rank2Types
或RankNTypes
,因此您可以稍后再推迟学习。
那些是我开始的那些。
编辑:删除了有关避免StandaloneDeriving
转发的评论。 (我在想孤儿实例。)
请注意,我已经与Haskell一起工作了一些,我已经就此问题发表了一些我自己的看法。 的mhwombat的建议ScopedTypeVariables
是好的。 现在通常是我开始编写Haskell模块时输入的第一个东西。 每当代码变得有点棘手时,我喜欢有很多类型签名来帮助我看看我在做什么,而这个扩展让我可以写出我不知道的东西。 它也可以显着改善类型错误。 当使用其他类型的系统扩展时,它似乎也是非常重要的。
直到我了解了一些关于依赖类型的编程语言之前,我并没有真正欣赏GADT。 注意我认为它们如何可以作为证明对象,以及它们如何受到类型索引的约束,真是太棒了。
GADTa与DataKinds
一起工作得非常好, DataKinds
可以生成有趣的类型索引,如列表和布尔值。 我现在可以做一些事情,比如表示一个索引列表与树高一样长,而不会使用高阶嵌套类型让自己疯狂。
我还没有探索多参数类型类和函数依赖关系。 然而,我已经开始欣赏爱德华·凯梅特的reflection
库,它在它的界面中使用它们。
我已经学会了对重叠和不连贯实例的健康尊重,我的意思是我从不使用它们。 重叠的感觉有点像宏编程,差错错误信息,而不连贯的是疯了。
RankNTypes
确实很强大。 这是很少需要的事情之一,但在需要时非常重要。
上一篇: Which GHC type system extensions should I try to learn first?