haskell - ¿Por qué agregar la restricción de tipo "Eq" sin usar "=="?
(1)
Entonces, tengo una función muy simple que toma dos parámetros: el primero es una hora (entre 0 y 23) y el segundo es un minuto (entre 0 y 59). Esta función devuelve la hora más un minuto y da formato a la hora con un estilo hermoso. Por ejemplo, la hour 11 12
regresa 11 heures et 13 minutes
. Lo siento por el formato francés de la hora.
Por lo tanto, en esta función utilizo la función show
, y los parámetros deben ser un número, así que tengo la declaración de tipo (Num a, Show a) => a -> a -> String
. Pero, cuando pruebo la función, recibí un error y GHC me dice que agregue la restricción de tipo Eq
, pero no entiendo por qué necesito la restricción de tipo Eq
en este caso. Ahí está el código (nuevamente, perdón por el texto en francés usado en la función, pero creo que no es muy importante si no entiendes el nombre de la función y el texto):
heure :: (Num a, Eq a, Show a) => a -> a -> String
heure 23 59 = "Minuit"
heure 12 m = "Midi et " ++ show (m+1) ++ " minutes"
heure h 59 = show (h+1) ++ " heures"
heure h m = show h ++ " heures et " ++ show (m+1) ++ " minutes"
Entonces: si no uso Eq
, tengo un error y cuando lo uso mi código es correcto. ¿Por qué?
¡Gracias por tus explicaciones!
Necesita la restricción Eq
porque está comprobando si h
es igual a 23
o 12
y si m
es igual a 59
. Lo estás haciendo usando la coincidencia de patrones, no ==
, pero la comparación de patrones contra literales numéricos de esa manera aún requiere la Eq
(a diferencia de la comparación de patrones contra constructores).