我为Alex做出了贡献,它显然取决于许多库,并且应该针对许多版本进行编译。

我需要使用仅GHC 7.6.1可用的函数才能更好地处理错误。所以我想使用#if ...导入所说的函数,否则,我将以不同的方式处理错误。

我看过一些:

#if __GLASGOW_HASKELL__ >= 610
import Control.Exception ( bracketOnError )
#endif

所以我做了:
#if __GLASGOW_HASKELL__ >= 761
import Text.Read ( readMaybe )
#endif

考虑到761是GHC版本7.6.1的别名,即使我使用cabal软件包并尝试使用它,也无法导入该函数,即使我使用的是Glorious Glasgow Haskell编译系统,即版本7.8.4

因此,在使用程序进行尝试之后,我发现7.8.1__GLASGOW_HASKELL__中标识为708
{-# LANGUAGE CPP #-}
module Main where

#if __GLASGOW_HASKELL__ == 708
ver = "==708"
#else
ver = "/=708"
#endif

main = putStrLn $ ver

并运行它:
$ runhaskell if.hs
==708

我怎么知道应该为7.6.1使用什么值,或者有更好的方法来解决这个问题?

最佳答案

GHC用户指南的section 6.11.3.1中对此进行了描述:

对于GHC的x.y.z版本,__GLASGOW_HASKELL__的值是整数⟨xyy⟩(如果⟨y⟩是一位数字,则添加前导零,例如,在GHC的6.2版中为__GLASGOW_HASKELL__==602)。有关更多信息,请参见GHC version numbering policy

因此,对于7.6.1,您将检查__GLASGOW_HASKELL__ >= 706。原因是像7.10.x这样的版本。

关于haskell - GHC版本 checkin 代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28292476/

10-14 04:20