J'ai une classe de types:Comment déclarer des instances d'une classe de type (comme Show) pour tous les types dans ma propre classe de types?
class Wrapper w where
open :: w -> Map String Int
close :: Map String Int -> w
Il ne semble pas très utile, mais je l'utiliser pour fortement (et pas seulement synonyme type
) la distinction entre les variétés sémantiquement différentes de Map String Int
s:
newtype FlapMap = Flap (Map String Int)
newtype SnapMap = Snap (Map String Int)
...
et ont encore des fonctions qui fonctionnent sur n'importe quel type de la classe.
- Y at-il une meilleure façon de faire cette distinction (peut-être sans les instances boilerplate
Wrapper
)?
Je veux faire:
instance (Wrapper wrapper) => Show wrapper where
show w = show $ toList $ open w
au lieu d'écrire un grand nombre d'instances de passe-partout Show
aussi bien.
Via FlexibleInstances
et UndecidableInstances
, GHC me conduit à un point où il pense ma déclaration d'instance s'applique à tout, comme elle se heurte apparemment avec les autres instances Show
dans mon code et à GHC.Show
. HaskellWiki et StackOverflow répondeurs et HaskellWiki me convaincre OverlappingInstances
n'est pas tout à fait sûr et peut-être déroutant. GHC ne le suggère même pas.
Pourquoi GHC d'abord se plaindre de ne pas savoir quelle instance de fx
Show Int
à ramasser (alors pourquoi il ne regarde pas la contrainte que je donne au moment de la compilation?) Puis, étant dit que les instances peuvent se chevaucher, soudainement savoir quoi faire? Puis-je éviter d'autoriserOverlappingInstances
avec mes codesnewtype
?
Est-ce que 'Deriving Show' est différent de ce que vous voulez réaliser? – chi
Oui. Je ne veux pas juste 'FlapMap (fromList [...])'. –
Je ne remplacerais pas l'instance de 'Show' car elle est vraiment utile pour créer une sortie, la montrer dans ghci et la copier dans un cas de test - en particulier en combinaison avec une jolie bibliothèque d'impression. Je préférerais créer une classe de caractères UserFriendlyShow - mais de toute façon, vous avez besoin de OverlappingInstances. – epsilonhalbe