Angenommen ich eine komplexe GADT haben, die mit vielen versteckten Typ Parameter als Erbauer:automatisch ableiten zeigen Instanzen für 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
ich ohne diesen Datentyp sendefähiges machen wollen, die manuell die Instanz zu schreiben. Problem ist, dass seit Show
keine Oberklasse von Num
mehr ist, das Hinzufügen einer einfachen deriving instance Show T
ist nicht genug für den Compiler zu schließen, dass es Show
Constraints zu allen internen versteckten Typ Parameter hinzufügen müssen.
Für jeden versteckten Typ-Parameter gibt es so etwas wie
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'
eine Show
Einschränkung in den Datentyp hinzuzufügen, ist keine Option, da sie die möglichen Bewohner von T
begrenzt. Es scheint wie deriving instanec Show T
sollte die Einschränkung Show
auf die versteckten Datentypen einführen, obwohl ich mir nicht sicher bin.
Wie kann ich darüber gehen?
Wenn das Hinzufügen der Einschränkung die Bewohner einschränkt, wird der Ableitungsmechanismus sicherlich nicht für Sie tun, noch würden Sie es wollen. – Lazersmoke
@Lazersmoke Ich meine, die Einschränkungen der abgeleiteten Instanz hinzuzufügen. Dies beschränkt die Bewohner nicht, es baut nur die "Show" -Instanz auf kohärente Weise auf. – ThreeFx
Es gibt keine gute Show-Instanz für T, egal was Sie tun, es sei denn, Sie beschränken alle Tyvars (einschließlich Existenzen) auf Anzeigen. – Lazersmoke