Supposons que j'ai un GADT complexe avec de nombreux paramètres de type cachés comme les constructeurs:découlant automatiquement des instances de spectacle pour GADTs
data T where
A :: Num n => n -> T
B :: (Num n, Integral m) => n -> m -> T
C :: Floating a => [a] -> T
-- and so on
Z :: Num n => n -> n -> T
Je veux faire de ce type de données montrable sans avoir à écrire manuellement l'instance. Le problème est que, puisque Show
n'est plus une super-classe de Num
, ajouter un simple deriving instance Show T
ne suffit pas pour que le compilateur déduise qu'il doit ajouter des contraintes Show
à tous les paramètres de type cachés internes.
Pour chaque paramètre de type caché, il émet quelque chose comme
Could not deduce (Show n) arising from a use of 'showsPrec'
from the context Num n
bound by a pattern with constructor
A :: forall n. Num n => n -> T
...
Possible fix:
add (Show n) to the context of the data constructor 'A'
Ajout d'une contrainte Show
au type de données n'est pas une option non plus, car elle limite les habitants possibles de T
. Il semble que deriving instanec Show T
devrait introduire la contrainte Show
sur les types de données cachés, bien que je ne sois pas sûr.
Comment puis-je faire à ce sujet?
Si l'ajout de la contrainte limite les habitants, le mécanisme de dérivation ne le fera certainement pas pour vous, et vous ne le voudriez pas non plus. – Lazersmoke
@Lazersmoke Je veux dire ajouter les contraintes à l'instance dérivée. Cela ne limite pas les habitants, il construit l'instance 'Show' de façon cohérente. – ThreeFx
Il n'y a pas de bonne instance de T pour Show, peu importe ce que vous faites, sauf si vous restreignez tous les tyvars (y compris les existentiels) à Show. – Lazersmoke