4

を使用するモジュールControl.ExceptionがありBase < 4ます。どうすれば、cabalまたはその他のツールを使用して、バージョンの依存関係を取り除き(依存するだけで、依存しない)、使用時および使用時にインポートできますか?Control.OldExceptionBase >= 4BaseBase < 4Control.OldExceptionBase >= 4Control.ExceptionBase < 4

4

3 に答える 3

8

cabal 使用するパッケージのバージョンに基づいて、特定のCPP定義を自動的に設定します。

だからあなたの場合、私は:

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

この方法は、カバールでうまく構築されます。

(実際には、新しい例外を使用し、ベース<4をサポートする必要はありませんが、それは私だけです)

于 2011-04-03T17:26:41.610 に答える
1

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)ます。

于 2011-04-03T17:38:17.467 に答える
-1

これは言語に依存しない答えであるため、当てはまらない場合があります。

いくつかのオプションがあります

  1. 両方の実装を持つSuperExceptionで両方の例外をラップします。に基づいて使用する実装を指示するパラメーターを指定しますBase
  2. オーバーライドされた呼び出しを使用して、ExceptionをOldExceptionの子になるようにリファクタリングします。(最良のオプション)
于 2011-04-03T17:23:27.270 に答える