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