2012-10-12 8 views
11

ハスケルでは、データ型を定義するときに、 のインスタンスを自動的に派生させることができますが、自動導出を延期できますか、おそらく 別のライブラリに入れますか?ここで宣言後の自動インスタンスの導出

は一例です:Haskellで導出

自動実際の時間の節約です!

module MoneyModule where 

data Money = Money Int 
    deriving Show 

今私はMoneyModuleを使用したいが、私はまたMoneyためReadインスタンスをしたい:

module ExternalModule where 

instance Read Money where 
    read = error "Can't this be done automatically instead?" 

しかし、それは自動的に導出されるために、私は本当に私はGHCができた知っている、好適だろうMoneyModuleの作成者だけがReadインスタンスを自動派生した場合には、この処理は完了しています。


私がことを知っている:

  • はそれが欠けているインスタンスとそれにパッチを適用することにより、実際のMoneyModuleで問題を解決する方が良いでしょう。
  • 孤立したインスタンスを持つことは悪いと考えられます。インスタンス宣言 は、好ましくは、型クラスまたはデータ タイプが定義されたモジュールに入れられます。

私の場合、タイプクラスはデータタイプと無関係であるため、ベストプラクティスに従うことはできません。私は型クラスモジュールやデータ型モジュール がインスタンスを保持したいと考えているので、一部の アプリケーションではインスタンス宣言が必要であるため、3番目のライブラリを作成しています。

答えて

14

GHCはそれでStandaloneDeriving拡張子を持っている、あなたは、多くのクラスのインスタンスを

{-# LANGUAGE StandaloneDeriving #-} 
import MoneyModule 

deriving instance Read Money 

導き出すことができます。

4

スタンドアローンの問題を解決するには、danielsソリューションを参照してください。しかしあなたの質問で言及したように、孤児のインスタンスはベストプラクティスではなく、ghcは警告を生成します。 ghc孤児の警告を無効にするには、フラグ-fno-warn-orphansを使用できます。カバールファイルに追加することもできます。

... 
library 
    exposed-modules: ... 
    ... 
    ghc-options: -fno-warn-orphans 
... 
関連する問題