2016-09-07 10 views
22

、以下のコンパイルcassavaパッケージを使用する:これは、2つの質問を私に残し`DeriveAnyClass`と空のインスタンスの違いは何ですか?

test.hs:7:50: 
    No instance for (ToNamedRecord Int) 
     arising from the first field of ‘Foo’ (type ‘Int’) 
    Possible fix: 
     use a standalone 'deriving instance' declaration, 
     so you can specify the instance context yourself 
    When deriving the instance for (ToNamedRecord Foo) 

{-# LANGUAGE DeriveGeneriC#-} 

import Data.Csv 
import GHC.Generics 

data Foo = Foo { foo :: Int } deriving (Generic) 
instance ToNamedRecord Foo 

ただし、次にはない:

{-# LANGUAGE DeriveGeneriC#-} 
{-# LANGUAGE DeriveAnyClass #-} 

import Data.Csv 
import GHC.Generics 

data Foo = Foo { foo :: Int } deriving (Generic, ToNamedRecord) 

コンパイラのレポートを2番目のバージョンが最初のバージョンと同じでないのはなぜですか?そして、なぜコンパイラがToNamedRecord Intのインスタンスを見つけることを望んでいるのですか?

+1

私は 'DeriveAnyClass'が役に立たないことはまだ見ていません。私はそれがコンパイル時のクラッシュを生成するのを見ました。 Methinks 'tisバギー。 – dfeuer

答えて

15

The GHC docsは言う:

インスタンスコンテキストが生成されるEqを導出する際に使用されるのと同じ規則 に従って(型の種類は*ある場合)、または ファンクタのための規則(種類場合タイプは(* -> *)です)。例えば

instance C a => C (a,b) where ... 

data T a b = MkT a (a,b) deriving(C) 

ためderiving句は

instance C a => C (T a b) where {} 

制約を生成するC aC (a,b)は、データコンストラクタ引数から生成されたが、C aに 後者の簡素化されています。

instance ToNamedRecord Foo where 

...と同じではありませんので、

Eqルールに従って、あなたのderiving句が生成...

instance ToNamedRecord Int => ToNamedRecord Foo where 

... ...スコープ内にinstance ToNamedRecord Intがある場合にのみ有効です(これはあなたのケースには表示されません)。

しかし、仕様が多少あいまいであることがわかります。この例で実際にコードを生成するか、instance (C a, C (a, b)) => instance C (T a b)を生成し、ソルバーに2番目の制約を適用させる必要がありますか?あなたの例では、完全に具体的な型のフィールドであっても、このような制約が発生しているようです。

私はどのようにEq作品、それはだから、バグこれを呼ぶのをためらうが、DeriveAnyClassが、それは速く、それは直感的に見えるんインスタンスを書くことにすることを目的としていることを与えられました。

+4

ありがとう、これは事を完全に説明する!これで、解決されている問題(「インスタンスにどのようなコンテキストを与えるべきか」)が強調されたので、GHCの人々がなぜそれらの決定を下したのかを知ることができます。 。 「仕事をする」という条件は信じられないほど具体的に見え、その条件で救う仕事は実際にはかなり小さいようです。 –

+3

私は同意します。ほとんど(すべて?'DeriveAnyClass'が有用なクラスの型は、その型の構造に基づく再帰的コンテキストではなく、' Generic'や 'Data'のような最上位のスーパークラスに依存します。生成されたコード自体が構造的に再帰的であるため、ルールは 'Eq'に対して意味があります。 –

関連する問題