2009-08-23 15 views
3

Je suis en train de définir un type algébrique:Haskell: les types de données Algebric dont les variables de type doivent être une instance d'une classe de types

data MyType t = MyType t 

et en faire une instance de Show:

instance Show (MyType t) where 
    show (MyType x) = "MyType: " ++ (show x) 

GHC se plaint de ne pas pouvoir déduire que le type 't' dans 'Show (MyType t)' est en fait une instance de Show, qui est nécessaire pour (show x).

Je ne sais pas où et comment puis-je déclarer 't' comme une instance de Show?

Répondre

18

Ajouter une contrainte de type sur le type de t:

instance Show t => Show (MyType t) where 
    show (MyType x) = "MyType: " ++ (show x) 
15

Vous pouvez aussi simplement:

data MyType t = MyType t 
    deriving Show 

si vous voulez un format d'exposition régulière.

2

Une autre solution consiste à utiliser GADTs:

data MyType t where 
    MyType :: Show a => a -> MyType a