Hola.
Intentando deducir el tipo más general de la siguiente función:
foo a b c d e = ((a == e) || (b > d), c + d)
llegué a que debería ser:
foo :: (Eq a, Real b) => a -> b -> b -> b -> a -> (Bool, b)
pero, en la solución, la correcta es:
foo :: (Eq a, Ord b, Num b) => a -> b -> b -> b -> a -> (Bool, b)
Mi pregunta es, ¿estoy siendo más específico?. De `c + d` yo deduzco que `c` y `d` deben tener tipo `Num a1`. Por otro lado, de `b > d` deduzco que `b` y `d` deben tener tipo `Ord a2`. Pero entonces, `d` no puede ser de cualquier tipo que sea instancia de `Num`, sino que debería ser un `Num` ordenable, por eso pienso que debería ser de tipo `Real a3`. La solución me convence porque dice `Ord b` y `Num b`, o sea ese `b` es instancia de `Num` pero también debe serlo de `Ord`, lo cual es compatible con lo que vengo diciendo. Es solo que `Real b` queda "por debajo" en la jerarquía de clases y me hace pensar que estoy siendo más específico, pero no veo por qué.