Practico 4 - Ejercicio 6

Practico 4 - Ejercicio 6

de Augusto Alonso Novo -
Número de respuestas: 3

Hola!

Tengo el siguiente código:

class Sizeable a where
    size :: a -> Int

instance Sizeable Int where
    size x = abs x

Al ejecutar size -3, por ejemplo, Haskell me da un error porque el tipo de -3 en realidad es Num y no Int que es el tipo para el que definí a instancia. Al ejecutar size (-3 :: Int) si funciona.

Hay alguna forma de evitar esto?

En respuesta a Augusto Alonso Novo

Re: Practico 4 - Ejercicio 6

de Marcos Viera - InCo -
El problema es que los literales numéricos están sobrecargados, y como bien decís, si hacés por ejemplo:

> :t 3
3 :: Num p => p

Entonces cuando hacés (size 3) no hay forma de saber qué instancia de Num elegiste, para saber qué instancia de Sizeable elegir.
En estos casos las opciones son indicar explícitamente el tipo (como hiciste) o que se pueda deducir del contexto.
Un ejemplo de lo segundo sería:

foo :: Int -> Int
foo x = x + size 3
En respuesta a Marcos Viera - InCo

Re: Practico 4 - Ejercicio 6

de Augusto Alonso Novo -
Pero size ya está definido con tipo a -> Int. Al hacer una instancia de Sizeable para Int no puedo redefinir el tipo de size, o si?