7

カバールは私に混合メッセージを与えています。私が言ったら:

Extensions: DeriveFunctor

それは言う:

Warning: Unknown extensions: DeriveFunctor

しかし、私が言うとき:

GHC-Options: -XDeriveFunctor

それは言う:

Warning: Instead of 'ghc-options: -XDeriveFunctor' use 'extensions:
DeriveFunctor'

今のところ、{-# LANGUAGE DeriveFunctor #-}プラグマを使用します。

$ cabal --version
cabal-install version 0.8.2
using version 1.8.0.6 of the Cabal library 
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.3
$ basename $(mdfind haskell-platform | grep .dmg)
haskell-platform-2010.2.0.0.i386.dmg
4

2 に答える 2

7

extensions: DeriveFunctor.cabal ファイルで引き続き使用できます。はい、現在 Cabal が認識している拡張機能ではありませんが、引き続き使用することができ、コンパイラが認識している限り機能します。実際、Cabal 自体は拡張子を認識していなくても、Cabal はコンパイラが拡張子を認識しているかどうかをチェックします。

モジュールには拡張機能の中央レジストリがありますLanguage.Haskell.Extension。このレジストリの目的は、異なるコンパイラが同じ拡張機能を実装するときに同じ名前に同意できるようにすることです。過去に、異なるコンパイラの作成者が誤って同じ拡張機能の概念に異なる名前を付けてしまったケースがありました。すべての拡張子を登録する必要はありません。まだ非常に実験的な拡張機能を登録しないことは理にかなっています。たとえば、DPH 拡張機能「PARr」はまだ登録されていません。Hackage は、アップロードされたすべてのパッケージが既知の登録済み拡張機能のみを使用することを要求します。これは、拡張機能が分散パッケージで使用する準備が十分に整っている場合、登録しても問題ないため、理にかなっています。

この特定のケースでは、GHC 開発者は拡張機能の登録を忘れているようです。

また、Cabal-1.10 の時点でフィールドがとのextensions2 つに分割されていることも注目に値します。これは、ジョンが彼の回答で指摘した問題に対処します。以前の動作では、すべての拡張機能がすべてのモジュールに対してアクティブであり、これは誤りであると認識しています。このフィールドでは、一部のモジュールで使用されている (つまり、プラグマで) 拡張機能を一覧表示できます。すべてのパッケージの依存関係をリストする必要があるのと同様に、 Cabal は最終的にそれらをすべてリストすることを強制します。言語の依存関係も依存関係です。default-extensionsother-extensionsother-extensionsLANGUAGE

于 2010-10-25T14:46:57.630 に答える
4

Hackage のドキュメントによると、Cabal-1.8.0.6 の時点DeriveFunctorでは認識されません。これは GHC に比較的新しく追加されたものであり、広く使用されていないようです。これはおそらく、Cabal に対するバグ (機能要求?) として提出する必要があります。

@Tom Lokhorst は、LANGUAGE プラグマが最適なオプションであるということは正しいです。Cabal の Extensions フィールドを使用するのは好きではありません。なぜなら、すべてのモジュールに対してすべての拡張機能がアクティブになるからです。

于 2010-10-23T01:07:15.310 に答える