haskell - 如何以向后兼容的方式为模块启用 Safe Haskell

标签 haskell backwards-compatibility cabal

假设您有一个您知道是安全的模块。

您想在模块本身中使用 {-# LANGUAGE Safe #-} 或在 cabal 中使用 Extensions: Safe 将其标记为 Safe Haskell文件。不幸的是,执行这些操作中的任何一个都会破坏向后兼容性(即模块不会构建在 GHC < 7.2 上)。

如果整个库都是安全的,您可以像这样将扩展指令包装在 cabal 文件中:

if impl(ghc >= 7.2)
  Extensions: Safe

但这只适用于整个图书馆。

如何以向后兼容的方式将单个模块标记为 Safe Haskell?

最佳答案

如果您不需要支持早于 6.12 的 GHC 版本(6.12.3 是我测试过的最旧版本¹),您可以使用预处理器来实现,

{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Safe #-}
#endif

或者,您可以在 .cabal 文件中使用标志来选择要包含的源文件。

¹ 对于 ghc-6.12,您必须在 # 之前将所有 {-# LANGUAGE #-} 未受 #if 保护的编译指示放在一组中if,从 7.0 开始,它们也可能出现在 #if 之后。

关于haskell - 如何以向后兼容的方式为模块启用 Safe Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11171325/

相关文章:

haskell - 将 Haskell 函数转换为点自由表示

windows - 无法让 Freeglut 在 Windows 上与 Haskell 一起工作

java - 尝试创建一个 Adapter 类来根据固件版本选择 .Java 文件

haskell - 如何升级gtk2hsC2hs?

haskell - 创建测试套件时出错 : "cannot satisfy -package-id"

haskell - {} in .cabal 用于 Haskell 中的 Haddock 文档

list - 查找两个列表中的最大数字-haskell

haskell - 实例声明中类型变量的顺序

.net - wcf - 更改整数值时枚举是否向后兼容?

android - 方法 NdefRecord.createTextRecord ("en", "string") 在 API 级别 21 以下不工作