2

安全であることがわかっているモジュールがあるとします。

{-# LANGUAGE Safe #-}モジュール自体またはExtensions: Safecabalファイルのようなもので、それをSafe Haskellとしてマークしたいと考えています。残念ながら、これらのいずれかを行うと下位互換性が失われます (つまり、モジュールは GHC < 7.2 ではビルドされません)。

ライブラリ全体が安全な場合は、次のように拡張ディレクティブを cabal ファイルにラップするだけです。

if impl(ghc >= 7.2)
  Extensions: Safe

しかし、それはライブラリ全体に対してのみ機能します。

下位互換性のある方法で、単一のモジュールを Safe Haskell としてマークするにはどうすればよいですか?

4

2 に答える 2

5

6.12 より古い GHC バージョンをサポートする必要がない場合 (6.12.3 は、私がコンストラクトをテストした中で最も古い¹)、プリプロセッサを使用してサポートできます。

{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Safe #-}
#endif

または、ファイル内でフラグを使用して、.cabal含めるソース ファイルを選択することもできます。

¹ ghc-6.12 では、 によって保護されていないすべての{-# LANGUAGE #-}プラグマを.#if#if#if

于 2012-06-23T18:17:13.500 に答える
2

モジュールの2つのバージョンを記述し、コンパイル時にどちらかを選択できます。例えば:

-- has-safe/Foo.hs
{-# LANGUAGE CPP #-}
foo = 3

-- no-safe/Foo.hs
{-# LANGUAGE CPP, Safe #-}
foo = 3

-- foo.cabal
if impl(ghc >= 7)
    hs-source-dirs: has-safe
else
    hs-source-dirs: no-safe

このアプローチには、CPPベースのアプローチに比べて長所と短所があります。主な利点は、カバールがサポートするすべての条件を利用して選択できることです。主な欠点は、同期を維持する2つのファイルがあることです。(ただし、これは特に自動化が容易なはずです。

echo {-# LANGUAGE Safe #-} > has-safe/Foo.hs
cat no-safe/Foo.hs >> has-safe/Foo.hs

各編集後no-safe/Foo.hsにトリックを実行する必要があり、さまざまな方法で自動化できます。)

于 2012-06-23T19:49:11.070 に答える