2017-02-21 2 views
4

Ich habe verschiedene Datentypen, die ich definiert habe, und ich möchte sie alle zu einer Instanz einer Klasse machen. Ist es möglich, eine Liste von Typen und Karteninstanzen zu erstellen, anstatt sie alle einzeln deklarieren zu müssen?kann ich eine Liste von Typen in Haskell machen?

Ich meine etwas wie folgt aus:

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

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

Wenn nicht alle diese Typen in der Form 'F x y ...' für einen einzelnen Typ 'F' mit verschiedenen Parametern neu geschrieben werden können, ist die einzige Option, die Instanzen über Template Haskell zu generieren. Es ist nicht sehr praktisch, also ist es die Kerze nur wert, wenn Sie viele Instanzen zu schreiben haben. – chi

+0

Was würde 'map (instance ClassName)' genau tun? 'map' nimmt eine Liste und macht mit jedem Element dasselbe. Sind alle Ihre Instanzen identisch? Dann müssen die Typen auch identisch sein, also warum verschiedene Typen? Oder ist 'ClassName' eine leere Klasse? Wofür ist es dann? –

+0

Ich benutze AESON, um JSON-Transformationen zu machen, Sie können generische verwenden, um Typen automatisch als Instanzen von und nach JSON deklarieren zu lassen, also verschiedene Typen zur Darstellung von JSON-Daten zu erzeugen. In diesem Fall machen Sie nur den Typ eine Instanz dieser Klassen, und sie benötigen keine weitere Definition. Mehrere Typen werden benötigt, um verschiedene JSON-Daten darzustellen. Für mich ist es sinnvoll, Instanzen nur über jeden Typ abzubilden. –

Antwort

10

Naja, eigentlich kann man, mit so etwas wie

{-# 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|]]) 

aber es kommt mir so massiv übertrieben, wenn Sie tatsächlich benötigen automatisch generiert werden (zB , die Liste der Typen kann abhängig von etwas variieren).