2017-10-10 3 views
0

Je suis en train de faire la structure personnalisée dans Haskell comme ceci:'+' est pas une méthode visible de classe

data Interval = Interval Float Float 
instance Interval Float Float where 
(Interval a b) + (Interval c d) = Interval (a + c) (b + d) 
(Interval a b) - (Interval c d) = Interval (a - c) (b - d) 

Mais les erreurs de everytime se produisent comme:

'+' est pas une méthode visible de classe 'Interval' Alors, comment dois-je faire correctement?

+3

Pourquoi vous essayez d'instancier quelque chose qui est pas une classe de type? – sepp2k

+0

Instanciez 'Num Interval' (peut-être pas une bonne idée) ou définissez vos fonctions en dehors d'une instance de classe de type. – chi

+0

Que voulez-vous dire? Désolé pour les questions stupides à l'avance, parce que je suis assez nouveau pour la programmation fonctionnelle. –

Répondre

5

Vous mélangez des définitions de types de données et des classes de types.

data Interval = Interval Float Float 

définit un nouveau type de données Interval, mais

instance Interval Float Float where 

serait la tentative de créer une instance d'une classe de type Interval.

Je ne suis pas sûr de ce que vous aviez l'intention, mais si vous voulez faire votre type Interval conforme à la classe de type Num qui offre des opérateurs tels que (+) etc. Ensuite, vous écrivez:

data Interval = Interval Float Float 

instance Num Interval where 
    (+) (Interval a b) (Interval c d) = Interval (a + c) (b + d) 
    (-) (Interval a b) (Interval c d) = Interval (a - d) (b - c) 

Notez que vous besoin d'implémenter plus de fonctions pour une instance complète de Num.

+2

Juste pour le plaisir: la façon dont l'affiche d'origine a défini leurs '(+)' et '(-)' (c'est-à-dire, infixer) fonctionne également une fois que le correctif proposé est implémenté. C'est-à-dire, 'instance Num Interval {- votre solution -} où (Intervalle a b) + (Intervalle c d) {- leur syntaxe pour définir + -} = Intervalle (a + c) (b + d) 'fonctionne très bien. Je voudrais même laisser de côté les parenthèses sur la gauche, en écrivant 'Interval a b + Interval c d = ...'. –

+0

Oui, ça marche super, merci –

2

Ce que vous avez

data Interval = Interval Float Float 

Vous dites Interval est un type avec un constructeur (également nommé Interval) qui a deux champs sans nom de type Float.

instance Interval Float Float where 

Vous dites Interval est une classe de type (PAS TYPE) qui prend deux paramètres de type que vous avez fournis comme Float s. Cela implique qu'il y a une ligne quelque part qui indique class Interval a b where ....

(Interval a b) + (Interval c d) = Interval (a + c) (b + d) 
(Interval a b) - (Interval c d) = Interval (a - c) (b - d) 

Ici, en supposant que vous MENT indenter, vous définissez deux fonctions qui sont des méthodes de la classe de type Interval (qui n'existe pas) et ces méthodes sont nommés + et -.

Qu'est-ce que vous pourriez avoir voulu

Je pense que vous vouliez définir un type, l'intervalle, et vous avez fait.

Je pense que vous vouliez définir addition et la soustraction qui sont des méthodes de la classe de type Num:

instance Num Interval where 
    (Interval a b) + (Interval x y) = Interval (a + b) (x + y) 
    ...