¡Clases de tipos!

Dijimos que la función + funciona para números, entonces es de suponer que puedo usarla con Int (enteros) o Float (números con coma). Pero, pero... ¿entonces cual es su tipo?

-- ¿es éste?
(+) :: Int -> Int -> Int
-- ¿o es éste?
(+) :: Float -> Float -> Float

¡Ninguno de esos! O para ser más justos: ninguno de esos es el tipo más general. Son tipos particulares que puede tomar la función +, mientras que el verdadero tipo general de la función es:

(+) :: Num a => a -> a -> a

¿Qué significa esto?

  • Que la suma toma dos parámetros y retorna un valor de cualquier tipo, mientras que ese tipo sea numérico;
  • que sea cual sea ese tipo numérico específico, si queremos que sea el mismo debemos usar la misma letra (podía ser la a como cualquier otra).

De eso se tratan las clases de tipos: son agrupaciones generales sobre tipos que se parecen entre sí. Y Num es una clase de tipos que agrupa a todos los tipos numéricos.

Por ejemplo: los Int y Float son tipos numéricos mientras que los Char, Bool, String, no.

Veamos si queda claro: escribí la función doble, y explicitá su tipo, esta vez dando su tipo más general.

Fijate si podés deducir la sintaxis en base a lo que acabamos de ver. Y si no, no te preocupes y mirá la ayuda .

¡Dame una pista!

¡Momento, momento! ¡Ayuda! ¿Cómo escribo el tipo usando esta flecha extraña => y las clases de tipos? ¡A no deseperar!

Si tuvieramos una función funcionLoca que tome dos Int y devolviera otro Int, su tipo sería así:

funcionLoca :: Int -> Int -> Int

Y si tomara dos Float y devolviera otro, su tip sería:

funcionLoca :: Float -> Float -> Float

Pero como vimos, es más general que eso, así que primero vamos a decir que es cualquier tipo...

funcionLoca :: a -> a -> a

...pero lo restringiremos para que sea numérico:

-- prestá atención a la =>: lo que está a la izquierda son restricciones,
-- y lo que está a la derecha, son los tipos (variables como `a` o específicos como `Float`)
funcionLoca :: Num a => a -> a -> a

¡Y así explicitamos el tipo de una función que usa clases de tipos!

Tenés que iniciar sesión antes de empezar a enviar tus soluciones