10
votes

À Haskell, comment dériver automatiquement une telle classe personnalisée?

Les codes ressemblent à ceci: xxx

ici myand est une classe de type qui a une fonction myand , je pensais qu'il est Générique et la seule contrainte est le A comporte une instance de Afficher Classe ..

dans le trappe Type de trappe , il est déjà dérivé de la classe de type Cependant, lorsque j'ai compilé les codes, le compilateur se plaint xxx

fait-il que quelqu'un a des idées à ce sujet?


0 commentaires

3 Réponses :


10
votes

Vous ne pouvez pas utiliser de dérivation avec des classes définies par l'utilisateur. Habituellement, dérivé 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.

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 dérivant n'est pas nécessaire et vous pouvez simplement utiliser une déclaration d'instance sans corps.

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 Myand en fonction de la fonction. < / p>


1 commentaires

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



9
votes

Pour ce problème spécifique, vous pouvez simplement éviter de définir une classe personnalisée: xxx

maintenant, Myand est applicable à TrafficLight S (ainsi que tous les autres montrent types capables).


0 commentaires

0
votes

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)


0 commentaires