Duda - clases Eq y Ord

Duda - clases Eq y Ord

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

Hola.

Si tengo esta función:

foo a b = if a < b then "hola" else "chau"

¿Por qué su tipo más general es foo :: Ord a => a -> a -> String, y no foo :: Eq a => a -> a -> String?

Mi duda de fondo es la relación entre las clases Eq y Ord. Yo pensaba que si un valor es de tipo Ord, también sería de tipo Eq porque Ord estaría "incluida" en Eq. Si pongo que el tipo de la función es Eq a, me marca error, así que no es como yo pienso, pero no entiendo bien porqué.


En respuesta a Santiago Agustín Silveira Pérez

Re: Duda - clases Eq y Ord

de Juan Pablo García Garland -
Hola. Primero una aclaración de vocabulario: los valores tienen tipo, y los tipos pueden pertenecer a una clase. No es correcto hablar de que "un valor es de tipo Ord".

Ahora yendo a este caso, para que un tipo sea miembro de la clase Ord, tiene que ser previamente miembro de la clase Eq, sí. Por lo tanto todo tipo de la clase Ord es de la clase Eq. Eso es correcto!

Pero no al revés: hay tipos de la clase Eq que no están en la clase Ord.

En el ejemplo foo usa < para comparar sus argumentos, por lo que necesitamos que el tipo de éstos sea ordenable, es decir, de la clase Ord. Si solo pedimos Eq en el tipo de foo, lo que estamos diciendo es que alcanza con que sepamos comparar elementos por igualdad, y no es cierto.

Tu error está en en razonamiento que estás haciendo al final, no en tus hipótesis. ¿Por qué a partir de que Ord implica Eq deducís que la firma debería ir Eq?

En donde sí importaría el hecho de que Eq es una superclase de Ord, es en un ejemplo como el siguiente:

foo a b = if a < b && a == b then "a" else "b"

a partir de los operadores uno puede deducir que los argumentos tienen que ser ordenables y comparables por igualdad. Como lo primero implica lo segundo, en este caso el tipo de foo es también:

foo :: Ord a => a -> a -> String

(es decir, no se agrega la constraint para Eq, pues ya está implícita en la constraint para Ord)