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

scv*_*lex 2 haskell backwards-compatibility cabal

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

您希望将其标记为Safe Haskell,类似于{-# LANGUAGE Safe #-}模块本身或类似于Extensions: Safecabal文件中的内容.不幸的是,这些中的任何一个都会破坏向后兼容性(即模块不会建立在GHC <7.2上).

如果整个库是安全的,您可以将extensions指令包装在cabal文件中,如下所示:

if impl(ghc >= 7.2)
  Extensions: Safe
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*her 5

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

{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Safe #-}
#endif
Run Code Online (Sandbox Code Playgroud)

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

¹对于ghc-6.12,你必须让所有的{-# LANGUAGE #-}pragma都没有被#if一个组保护#if,因为从7.0开始,它们也可能出现在#if.