新类型比抽象类型别名更好

主要观点:OCaml 的标志性功能之一是“抽象类型”,可在模块内声明类型并隐藏定义使其对外界抽象;Haskell 因模块系统较弱,以不导出构造函数的数据类型或新类型实现抽象类型,使用时需到处包装和解包;抽象类型同义词存在隐藏信息过多的致命缺陷,如在涉及 GADTs 的示例中,OCaml 会抱怨未处理AnInt情况,而编译器无法泄漏内部类型信息,导致无法消除涉及抽象类型的模式匹配;新类型避免此问题,因为其类型始终分离;在有全局连贯类型类的语言中,不能在抽象类型同义词上实现类型类实例,否则可能违反数据结构的内部不变量,所以新类型优于抽象类型同义词。
关键信息:OCaml 中抽象类型的使用方式及特点;Haskell 中抽象类型通过新类型实现及存在的问题;抽象类型同义词隐藏信息过多的示例及后果;新类型避免问题的原因及与抽象类型同义词的对比;类型类在相关语言中的作用及与抽象类型同义词的关系。
重要细节:OCaml 中Unix模块示例展示抽象类型的使用;Haskell 中Unix模块示例展示新类型的使用及存在的问题;涉及 GADTs 的 OCaml 和 Haskell 示例对比;关于Coercible的说明等。

阅读 26
0 条评论