Votre question est assez ambiguës. Si j'interprète correctement, vous essayez de changer l'instance Show
par défaut pour [SimpleRecord]
.
Comme GHC a déjà défini l'instance Show [a]
lorsque Show a
est défini. Vous obtenez l'erreur suivante (après avoir inclus l'extension FlexibleInstances
) lorsque vous essayez de définir à nouveau l'instance pour Show [SimpleRecord]
.
Matching instances:
instance Show a => Show [a] -- Defined in `GHC.Show'
instance Show [SimpleRecord] -- Defined at show.hs:5:11
Vous devez utiliser OverlappingInstances
extension de la langue pour permettre le surcharger. Il indique que GHC doit correspondre à l'instance la plus spécifique.
Vous pouvez également inclure FlexibleInstances
extension, ce qui permet de parler de types imbriqués arbitraires déclaration d'instance ..
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
newtype SimpleRecord = SimpleRecord ([Char], [Char], Integer)
deriving (Show)
instance Show [SimpleRecord] where
show [SimpleRecord (n, i, c)] = show (SimpleRecord (n, i, c))++"\n"
show (l:ls) = show l ++ "\n" ++ show ls
Vous obtenez plus d'informations sur ces extensions de langue à GHC Docs
Juste un commentaire sur la conception de votre type, il est préférable de définir votre type comme
data SimpleRecord = SimpleRecord String String Integer
Vous obtenez mo re flexibilité ici en termes d'application constructeur partiel etc.
La classe 'show' a une méthode' showList' de sorte que vous pouvez les personnaliser. C'est ainsi que les chaînes alias '[Char]' sont affichées différemment. Remarque - vous ne pouvez pas dériver 'Show' pour SimpleRecord, vous devez le faire vous-même et définir' showList' en même temps. –
Vous pouvez écrire une fonction qui n'est pas appelée 'show' et l'utiliser. – AndrewC