GHC有一个类型系统扩展的整个动物园:多参数类型类,功能依赖,秩n多态,存在类型,GADT,类型族,范围类型变量等等.哪些可能是最容易学习的?另外,这些功能是否以某种方式组合在一起,或者它们是否完全相同,可用于完全不同的目的?
早期学习的好处是ScopedTypeVariables,因为它们对于调试函数中的类型问题非常有用.当我有一个令人困惑的类型错误时,我暂时在函数中的每个表达式上添加类型声明.(通常你需要打破一些表达式才能看到真正发生的事情.)这通常可以帮助我确定哪个表达式的类型与我预期的不同.
TypeFamilies比MultiParamTypeClasses你强大,所以你真的不需要后者.当类型系列工作,你通常需要启用FlexibleContexts和FlexibleInstances为好,使三大编译指示您将学习为一体的价格.FunctionalDependencies通常使用MultiParamTypeClasses,所以这是你现在可以忽略的.
GHC很擅长告诉你何时需要启用Rank2Types或者RankNTypes,所以你可以推迟学习更多关于这些的知识,直到稍后.
那些是我开始的.
编辑:删除了关于避免的评论StandaloneDeriving.(我在考虑孤儿实例.)