Estoy tratando de representar los bordes pesados. Eventualmente quiero que OutE sea una instancia de Eq y Ord, con la restricción de que etype es una instancia de Eq y Ord. Suponga que he archivo siguiente como temp.hs:Agregar restricciones de tipo al contexto de las declaraciones de instancia en 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 (/=)
cuando me carga esta en ghci, consigo los siguientes errores:
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 incluirá las líneas para las firmas de tipos de (==) y (\ =), me sale:
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)' generará operadores de igualdad basados en ** todos ** campos de registro (y así generará una incómoda instancia de 'Eq' con' Eq vtype') mientras que la instancia explícita dada en la pregunta solo se compara en función de 'edgeValue '. – Dario
Derecho, no me di cuenta de que estaba haciendo eso hasta después de escribir ese bit. Gracias por señalar eso. –