如何只为 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-install
或 stack
)。
在您麻烦地执行此操作之前,请注意有几个名称以 -compat
结尾的包可以为您完成所有工作。在这种情况下,您可以使用 base-compat
包中 Data.Either.Compat
的 fromRight
。那么你就不必关心你是否使用了足够新的 base
库。
我有一段代码使用了大约 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-install
或 stack
)。
在您麻烦地执行此操作之前,请注意有几个名称以 -compat
结尾的包可以为您完成所有工作。在这种情况下,您可以使用 base-compat
包中 Data.Either.Compat
的 fromRight
。那么你就不必关心你是否使用了足够新的 base
库。