Haskell GHC版本签入代码

Haskell GHC版本签入代码,haskell,ghc,Haskell,Ghc,我正在为它做贡献,它显然依赖于很多库,并且应该编译很多版本 我需要使用GHC 7.6.1中提供的函数来更好地处理错误。因此,我想使用#if…导入所述函数,否则,我将以不同的方式处理错误 我看到了一些: #if __GLASGOW_HASKELL__ >= 610 import Control.Exception ( bracketOnError ) #endif 所以我做了: #if __GLASGOW_HASKELL__ >= 761 import Text.Read ( rea

我正在为它做贡献,它显然依赖于很多库,并且应该编译很多版本

我需要使用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软件包并试用它时,该函数没有被导入,即使我使用了光荣的格拉斯哥哈斯克尔编译系统版本7.8.4

因此,在使用一个程序进行尝试之后,我发现
7.8.1
\uuu格拉斯哥\uu哈斯克尔\uuu
中标识为
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的x.y.z版本,
\uu格拉斯哥•哈斯凯尔•ucode>的值是整数xyy(如果y是一个位数,则会添加前导零,因此,例如在GHC的6.2版本中,
\uu格拉斯哥•哈斯凯尔•ucode>==602)。更多信息请参见第1.4节“GHC版本编号政策”

如果运气好的话,
\uuuuuuu GLASGOW\uuhaskell\uuuuu
将在所有其他支持C风格预处理的实现中被取消定义

(参考:其他系统的可比符号为:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

注意。在预处理Haskell源和C源时设置此宏,包括从Haskell模块生成的C源(即.hs、.lhs、.C和.hc文件)

如GHC《用户指南》第1部分所述:

对于GHC的版本
x.y.z
\uuuuu GLASGOW\uu HASKELL\uuuu
的值为整数⟨xyy⟩ (如果⟨Y⟩ 是一个位数,然后添加前导零,例如在GHC的6.2版中,
\uuuuuuu GLASGOW\uuu HASKELL\uuuu==602
)。更多信息请参阅


因此,对于
7.6.1
,您可以检查
\uu格拉斯哥\uu哈斯克尔\uu>=706
。原因是类似于
7.10.x

的版本,正如Daniel Wagner指出的,检查软件包版本的最正确方法通常是使用Cabal
MIN_版本
宏。例如,您可以使用

#if MIN_VERSION_base(4,6,0)
确定
base
软件包是否至少为4.6.0版,这是您寻求的功能的最早版本

base
包有点奇怪。GHC和现已不复存在的Hugs和NHC实现都使用了它。使用Cabal宏是检查
base
版本的一种更方便的方法。如今,GHC是唯一一个使用
base
,因此可移植性的论据就不那么清晰了,但这种方法还有检查主要版本号和次要版本号的优势

由于
base
版本与GHC版本的关系非常紧密,因此您可以定义
MIN\u VERSION\u base
的合理回退形式,以便在没有阴谋集团的情况下进行编译,使用
\u格拉斯哥\u HASKELL\u
来估计
base
版本。当前的
容器
头部有条件地定义了这样一个后退

更新
从GHC 8开始,编译器本身已经接管了定义
MIN_VERSION
宏的工作。这很好,因为无论您是否使用阴谋集团构建,您现在都可以使用这些宏。再也没有丑陋的近似了

我应该检查版本
706
还是
707
。因为
7.6.0
没有这个功能。@chamini2这似乎不太可能。较小的版本更改(第三个数字)应该只修复bug,否则不应该更改功能(cf)。这个函数是什么?好的,我明白了
readMaybe
from
Text.读取
,在项目符号1.5.3.2基础中。所以
706
应该可以吗?@chamini2如果你想依赖一个版本的base,你应该这样做,而不是依赖一个版本的GHC。使用cabal的MIN_版本宏系列(再次阅读详细文档,了解它们的工作原理)。