如何只为 GHC 中的旧版本定义函数?

How to define function only for old versions in GHC?

我有一段代码使用了大约 GHC 8.2 定义的 fromRight 函数。但是我需要降级到 GHC 8.0.2,它给出了关于 Variable not in scope: for fromRight

的错误

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

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

只有当我使用 GHC 版本高于 8.2.1 时才使用它吗?

你随时可以写

import Prelude hiding (fromRight)

即使 fromRight 在 Prelude 中不存在也是有效的。因此,如果您想编写一个同时兼容新旧版本 Prelude 的模块,您可以简单地选择忽略新的 fromRight 函数,并始终使用库中的函数。

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

{-# language CPP #-}

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

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


在您麻烦地执行此操作之前,请注意有几个名称以 -compat 结尾的包可以为您完成所有工作。在这种情况下,您可以使用 base-compat 包中 Data.Either.CompatfromRight。那么你就不必关心你是否使用了足够新的 base 库。