J'essaie de représenter des arêtes pondérées. Je veux finalement avoir OutE pour être une instance de Eq et Ord, avec la contrainte que etype est une instance de Eq et Ord. Supposons que je suit le fichier comme temp.hs:Ajout de contraintes de type au contexte des déclarations d'instance dans Haskell
data (Ord etype)=> OutE vtype etype = OutE {destVertex:: vtype, edgeValue::etype}
applyFunBy accessor ordfun = (\x y -> (ordfun (accessor x) (accessor y)))
instance Eq (OutE vtype etype) where
--(==) :: Ord etype => (OutE vtype etype) -> (OutE vtype etype) -> Bool
--(/=) :: Ord etype => (OutE vtype etype) -> (OutE vtype etype) -> Bool
(==) = applyFunBy edgeValue (==)
(/=) = applyFunBy edgeValue (/=)
quand je charge cela dans ghci, je reçois les erreurs suivantes:
temp.hs:10:19:
Could not deduce (Ord etype)
from the context (Eq (OutE vtype etype))
arising from a use of `edgeValue' at temp.hs:10:19-27
Possible fix:
add (Ord etype) to the context of the instance declaration
In the first argument of `applyFunBy', namely `edgeValue'
In the expression: applyFunBy edgeValue (==)
In the definition of `==': == = applyFunBy edgeValue (==)
temp.hs:11:19:
Could not deduce (Ord etype)
from the context (Eq (OutE vtype etype))
arising from a use of `edgeValue' at temp.hs:11:19-27
Possible fix:
add (Ord etype) to the context of the instance declaration
In the first argument of `applyFunBy', namely `edgeValue'
In the expression: applyFunBy edgeValue (/=)
In the definition of `/=': /= = applyFunBy edgeValue (/=)
Failed, modules loaded: none.
Si inclure les lignes pour les signatures de type pour (==) et (\ =), je reçois:
temp.hs:6:1:
Misplaced type signature:
== ::
(Ord etype) => (OutE vtype etype) -> (OutE vtype etype) -> Bool
temp.hs:7:1:
Misplaced type signature:
/= ::
(Ord etype) => (OutE vtype etype) -> (OutE vtype etype) -> Bool
'deriving (Eq)' va générer des opérateurs d'égalité basés sur ** tous ** champs d'enregistrement (et donc générer une instance lourde de 'Eq' avec un' Eq vtype') alors que l'instance explicite donnée dans la question compare juste en fonction de 'edgeValue '. – Dario
Juste, je n'ai pas remarqué qu'il le faisait avant d'avoir écrit ce morceau. Merci d'avoir fait remarquer cela. –