如何只为GHC中的旧版本定义功能?

时间:2017-11-02 00:01:14

标签: haskell ghc

我有一个使用大约GHC 8.2定义的fromRight函数的代码。但是我需要降级到GHC 8.0.2,这会导致Variable not in scope:

fromRight错误

我想知道是否可能以及如何添加缺少的定义

fromRight :: b -> Either a b -> b
fromRight _ (Right b) = b
fromRight b _         = b

只有当我使用GHC版本而不是8.2.1时才使用它?

2 个答案:

答案 0 :(得分:5)

通常,当您想知道库函数时,您应该使用CPP。

{-# language CPP #-}

#if !MIN_VERSION_base (4,10,0)
fromRight :: ...
#endif

Cabal提供的MIN_VERSION_...宏;现在他们是由GHC提供的。如果您想将它们与GHC的旧版本一起使用,则需要使用Cabal(使用cabal-installstack)。

在您遇到此问题之前,请注意,有几个名称以-compat结尾的软件包可以为您完成所有工作。在这种情况下,您可以使用fromRight包中的Data.Either.Compat base-compat。那么您不必关心是否使用了足够新的base库。

答案 1 :(得分:3)

你总是可以写

import Prelude hiding (fromRight)

即使Prelude中不存在fromRight也是有效的。因此,如果您想编写一个与Prelude的新版本和新版本兼容的模块,您只需选择忽略新的fromRight函数,并始终使用库中的函数。