Parcial 2020 - Ej 1

Parcial 2020 - Ej 1

de Santiago Agustín Silveira Pérez -
Número de respuestas: 1

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é.

En respuesta a Santiago Agustín Silveira Pérez

Re: Parcial 2020 - Ej 1

de Marcos Viera - InCo -
Hola,

Lo que te expresa la jerarquía es que:
- Pueden haber tipos que sean instancia de Ord y de Num y que no sean instancia de Real.
- Lo que no puede pasar es que haya un tipo que sea instancia de Real y no sea instancia de Ord y de Num.

saludos