2011-04-03 105 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