Práctico 4- Ejercicio 6-b

Práctico 4- Ejercicio 6-b

de Daniel Alejandro Garcia Miranda -
Número de respuestas: 1

Estoy intentando crear una instancia para listas y me el compilador me da error en "size7 x". Este es mi código:

class Sizable a where
    size7 :: a -> Int

instance Sizable Int where
    size7 n = abs n

instance Sizable Char where
    size7 _ = 1

instance Sizable [a] where
    size7 [] = 0
    size7 (x:xs) = size7 x + size7 xs
Mi idea era que en size7 x "identifique" si es una lista de char(y devolver 1) o lista de Int y devuelva el valor absoluto. Luego calcule con el resto de la lista. Estoy manejando mal algún concepto, quería saber cual.
Saludos

En respuesta a Daniel Alejandro Garcia Miranda

Re: Práctico 4- Ejercicio 6-b

de Luis Sierra -
hola,

al cargar en ghci tu código me tira el siguiente mensaje:

sz.hs:12:20: error:
• No instance for (Sizable a) arising from a use of ‘size7’
Possible fix:
add (Sizable a) to the context of the instance declaration
• In the first argument of ‘(+)’, namely ‘size7 x’
In the expression: size7 x + size7 xs
In an equation for ‘size7’: size7 (x : xs) = size7 x + size7 xs

tu idea es correcta: "...que en size7 x "identifique" si es una lista de char ... o lista de Int". pero podrías ser un poco más ambicioso, y proponerte "...que en size7 x "identifique" si es una lista de algo que sea de la clase Sizable".

ghci protesta porque querés usar size7 a un objeto del que no sabés si es Sizeable o no. en las transparencias aparece el ejemplo siguiente:

"Las instancias tambi ́en pueden depender de que los tipos pertenezcan a
otras clases:
instance (Eq a,Eq b) => Eq(a,b) where ...
"

y eso es lo que te falta. decir que para que una lista de cosas sea Sizeable,
sus elementos deben serlo. en breve, como dice el "Possible fix" que te indica
ghci, agregar

instance Sizable a => Sizable [a] where ...

saludos

luis