从GHC的手册,安全语言部分:
模块边界控制 - 使用安全语言编译的Haskell代码保证只能访问通过其他模块导出列表公开可用的符号.其中一个重要的部分是安全编译的代码无法使用无法导入的数据构造函数来检查或创建数据值.如果模块M通过仔细使用其导出列表建立了一些不变量,则使用导入M的安全语言编译的代码保证遵守这些不变量.因此,模板Haskell
GeneralizedNewtypeDeriving以安全语言禁用,因为它们可用于违反此属性.
如何使用GeneralizedNewtypeDeriving?打破模块的不变量?