2011-04-03 108 views
4

我有一个模块使用Control.ExceptionBase < 4这是 Control.OldException。如何在使用Base >= 4Control.Exception时使用cabal或任何其他工具摆脱版本依赖关系(仅取决于Base而不是Base < 4)并导入Control.OldException?当使用Base < 4时使用Base >= 4Control.Exception依赖版本的不同进口

回答

8

cabalautomatically sets certain CPP definitions根据使用的软件包版本。

因此,对于你的情况我会:

{-# LANGUAGE CPP #-} 
module Blah where 
#if MIN_VERSION_base(0,4,0) 
import Control.OldException 
#else 
import Control.Exception 
#endif 

此方法构建罚款阴谋。

(实际上,我会用新的异常,并不会理会配套基地< 4,不过这只是我)

+0

这正是我一直在寻找的,谢谢! – HaskellElephant 2011-04-03 17:30:12

-1

这是一个语言不可知的答案,所以它可能不适用于你。

有一对夫妇选择

  1. 裹在具有两种实现一个SuperException两个例外。给它一个参数,告诉它基于Base使用什么实现。
  2. 重构异常是带有重载调用的OldException的子节点。 (最佳选项)
+3

你是对的,这不适用于此,这将需要重构Haskells标准库。我无法做的事情= D。你可能没有意识到的是,Control.Exception不是一个类,它是一个模块。 – HaskellElephant 2011-04-03 17:29:31

1

随着惊天动地,这是与“旗帜”,其约束求解算法来实现。一个例子(从control-monad-exceptionHackage):

Flag extensibleExceptions 
    description: Use extensible-exception package 
    default: False 

(...) 

    if flag(extensibleExceptions) 
    build-depends: 
     extensible-exceptions >= 0.1 && <0.2, 
     base >= 3.0 && <4 
    else 
    build-depends: 
     base >= 4 && < 5 

在使用旧版本的base一台机器,惊天动地将尝试解决extensibleExceptions False的依赖,失败,然后用它True重试,并使用不同的build-depends,这将会成功。 (您也可以通过命令行打开国旗。)

http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#configurations文件这一机制,并在页面的其余部分将介绍其他机制,包括直接的条件语句,如if impl(ghc >= 6.10.0)

+0

这是与他正在做的事情相反的解决方案(因为他正在使用_new_异常)。由于他使用的是旧的异常(不幸),并且'Control.OldException'仍然在基础中(不幸),所以他只需要使用CPP。不幸。 – 2011-04-03 20:41:58