を使用するモジュールControl.Exception
がありBase < 4
ます。どうすれば、cabalまたはその他のツールを使用して、バージョンの依存関係を取り除き(依存するだけで、依存しない)、使用時および使用時にインポートできますか?Control.OldException
Base >= 4
Base
Base < 4
Control.OldException
Base >= 4
Control.Exception
Base < 4
3 に答える
cabal
使用するパッケージのバージョンに基づいて、特定のCPP定義を自動的に設定します。
だからあなたの場合、私は:
{-# LANGUAGE CPP #-}
module Blah where
#if MIN_VERSION_base(0,4,0)
import Control.OldException
#else
import Control.Exception
#endif
この方法は、カバールでうまく構築されます。
(実際には、新しい例外を使用し、ベース<4をサポートする必要はありませんが、それは私だけです)
Cabalでは、これは「フラグ」とその制約解決アルゴリズムを使用して行われます。例(ハッキングのcontrol- monad -exceptionから):
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
、Cabalはで依存関係を解決しようとし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)
ます。
これは言語に依存しない答えであるため、当てはまらない場合があります。
いくつかのオプションがあります
- 両方の実装を持つSuperExceptionで両方の例外をラップします。に基づいて使用する実装を指示するパラメーターを指定します
Base
。 - オーバーライドされた呼び出しを使用して、ExceptionをOldExceptionの子になるようにリファクタリングします。(最良のオプション)