繁体   English   中英

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

[英]How to define function only for old versions in GHC?

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

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

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

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

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

{-# language CPP #-}

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

MIN_VERSION_...宏曾经由Cabal提供; 现在他们是由GHC提供的。 如果你想在GHC的旧版本中使用它们,你需要使用Cabal(使用cabal-installstack )。


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

你总是可以写

import Prelude hiding (fromRight)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM