Comment instancier correctement les classes dans Haskell?
Question
Essayer de créer une classe de base à partir de laquelle je peux tirer différents types. Quel est le problème avec ce qui suit?
class (Eq a) => MyClass a
data Alpha = Alpha
instance MyClass Alpha where
Alpha == Alpha = True
Je reçois l'erreur:
test.hs:5:10: `==' is not a (visible) method of class `MyClass'
Failed, modules loaded: none.
La solution
Vous devez faire Alpha une instance de Eq explicitement. Cela fonctionne:
data Alpha = Alpha
instance Eq Alpha where
Alpha == Alpha = True
instance MyClass Alpha
Autres conseils
La première ligne indique que vous devez déclarer Alpha une instance de l'équation, puis de MyClass.
Sur la base de la structure de la question, il semble que vous vous attendez à Haskell à se comporter de classes de types d'une manière similaire à des classes dans un langage orienté objet. Sont plus comme classes de types d'interfaces Java.
Il n'y a pas d'héritage. Une classe de types est simplement une description d'un ensemble de fonctions qui sont mises en œuvre pour un type. Contrairement à une interface Java, ces fonctions peuvent être définies en termes de l'autre, de sorte qu'une déclaration d'instance minimale complète ne peut être nécessaire de définir certaines des fonctions.