Les codes ressemblent à ceci: ici dans le trappe code> Type de trappe code> , il est déjà dérivé de la classe de type code> code> Cependant, lorsque j'ai compilé les codes, le compilateur se plaint p> fait-il que quelqu'un a des idées à ce sujet? P> p> myand code> est une classe de type qui a une fonction myand code>, je pensais qu'il est Générique et la seule contrainte est le A code> comporte une instance de Afficher code> Classe .. p>
3 Réponses :
Vous ne pouvez pas utiliser de dérivation avec des classes définies par l'utilisateur. Habituellement, Dans votre cas, il semble que tout ce que vous voulez, c'est utiliser les implémentations par défaut de la méthode One Votre classe, donc aucune implémentation ne devrait être générée par le compilateur. Bien sûr, cela signifie que PS: si vous souhaitez toujours utiliser la mise en œuvre par défaut de la méthode, il peut avoir le plus de sens de ne pas utiliser de classe du tout, mais définissez simplement dérivé code> génère automatiquement un code pour les méthodes de la classe donnée, ce qui n'est possible que car le compilateur sait que les méthodes sont censées faire et peuvent ainsi générer des implémentations appropriées en fonction de la structure de votre type. Ceci n'est évidemment pas possible pour les classes définies par l'utilisateur car le compilateur n'a aucun moyen de savoir comment les méthodes sont censées se comporter. P>
dérivant code> n'est pas nécessaire et vous pouvez simplement utiliser une déclaration d'instance sans corps. P>
Myand code> en fonction de la fonction. < / p>
C'est vrai, le compilateur ne sait pas quelles sont censées les méthodes. Mais peut-être qu'un ajout utile à la langue serait un moyen de le dire. Connexes: Stackoverflow.com/a/3864801/524504
Pour ce problème spécifique, vous pouvez simplement éviter de définir une classe personnalisée: maintenant, Myand code> est applicable à TrafficLight code> S (ainsi que tous les autres montrent code> types capables). p> p>
a trouvé cette question tout en essayant de déterminer comment utiliser l'extension DeriveanyClass code> de GHC, qui n'avait été sorti que pendant trois semaines lorsque cela a été posé.
Utiliser, ce qui suit fonctionne comme vous "D APPECT: P>
{-# LANGUAGE DeriveAnyClass #-}
class Show a => MyAnd a where
myAnd :: a -> a -> String
x `myAnd` y = (show x) ++ " and " ++ (show y)
data TrafficLight = Red | Yellow | Green deriving (Show, MyAnd)