假设您有一个您知道是安全的模块。
您想在模块本身中使用 {-# 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,您必须在 # 之前将所有
,从 7.0 开始,它们也可能出现在 {-# LANGUAGE #-}
未受 #if
保护的编译指示放在一组中if#if
之后。
关于haskell - 如何以向后兼容的方式为模块启用 Safe Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11171325/