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

tin*_*lyx 4 haskell ghc

我有一个代码,使用fromRight大约GHC 8.2定义的函数.但我需要降级到8.0.2 GHC,这给了约一个错误Variable not in scope:fromRight

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

fromRight :: b -> Either a b -> b
fromRight _ (Right b) = b
fromRight b _         = b
Run Code Online (Sandbox Code Playgroud)

所以它只在我使用GHC版本而不是8.2.1时使用?

dfe*_*uer 5

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

{-# language CPP #-}

#if !MIN_VERSION_base (4,10,0)
fromRight :: ...
#endif
Run Code Online (Sandbox Code Playgroud)

这些MIN_VERSION_...宏过去由Cabal提供; 现在他们是由GHC提供的.如果你想在GHC的旧版本中使用它们,你需要使用Cabal(使用cabal-install或者stack).


在你遇到这样做的麻烦之前,请注意有几个包含名称结尾的包,-compat可以为你完成所有工作.在这种情况下,你可以使用fromRightData.Either.Compatbase-compat包中.那么你不必在意你是否使用了足够新的base库.