2017-02-21 18 views
4

私は定義したデータ型が異なり、それらをすべてクラスのインスタンスにしたいと考えています。個々に宣言するのではなく、型のリストを作成してインスタンスをマップすることは可能ですか?私はhaskellで型のリストを作ることができますか?

私はこのような何か意味:あなたは

{-# LANGUAGE TemplateHaskell #-} 

module T where 

class C a 

data X = X 
data Y = Y 
data Z = Z 

$(fmap concat $ mapM (\t -> [d|instance C $t|]) [[t|X|], [t|Y|], [t|Z|]]) 

ようなもので、実際に

data Type1 = ... 
data Type2 = ... 

map (instance ClassName) [Type1, Type2] 
+1

異なるパラメータを持つ単一の型 'F'に対して、これらの型を' F x y ... 'の形式で書き換えることができない限り、テンプレートHaskellでインスタンスを生成する唯一のオプションだと思います。それは非常に便利ではないので、書き込みするインスタンスがたくさんある場合にのみ、キャンドルの価値があります。 – chi

+0

'map(instance ClassName)'とは何ですか? 'map'はリストを取り、各項目に対して同じことを行います。すべてのインスタンスが同一ですか?それで型も同じでなければならないので、なぜ型が違うのですか?または 'ClassName'は空のクラスですか?それは何のためですか? –

+0

私はjson変換を行うためにaesonを使用しています。ジェネリックを使用して、fromとjsonのインスタンスとして自動的に宣言される型を持つことができます。この場合、タイプをそれらのクラスのインスタンスにするだけです。さらに別の定義を必要としません。さまざまなJSONデータを表現するのに必要ないくつかの型があり、それぞれの型にインスタンスをマップすることが理にかなっています。 –

答えて

10

まあをすることができますが、あなたが実際に例えば(自動的に生成されるようにそれらを必要としない限り、それは大規模なやり過ぎとして私を打ちますタイプによってはリストの種類が異なる場合があります)。