有时,如果没有至少一个语言扩展,我想编写的一段代码是不合法的。当试图在研究论文中实现想法时尤其如此,这些论文倾向于使用撰写论文时可用的任何漂亮的、超扩展的 GHC 版本,而没有明确说明实际需要哪些扩展。
结果是我经常在 .hs 文件的顶部得到类似这样的内容:
{-# LANGUAGE TypeFamilies
, MultiParamTypeClasses
, FunctionalDependencies
, FlexibleContexts
, FlexibleInstances
, UndecidableInstances
, OverlappingInstances #-}
我不介意,但我常常觉得我在做盲目的牺牲来安抚GHC的大神。它抱怨某段代码在没有语言扩展 X 的情况下无效,所以我为 X 添加了一个 pragma。然后它要求我启用 Y,所以我为 Y 添加一个 pragma。到这完成时,我已经启用三四种我不太了解的语言扩展,我不知道哪些是“安全的”。
解释我所说的“安全”是什么意思:
我知道这
UndecidableInstances
是安全的,因为尽管它可能导致编译器不终止,但只要代码编译它就不会产生意外的副作用。另一方面,
OverlappingInstances
显然是不安全的,因为它让我很容易意外地编写出运行时错误的代码。
所以我的问题是:
是否有被认为是“安全”和“不安全”的 GHC 扩展列表?