Ejercicio de repaso - Tipos algebraicos

Ejercicio de repaso - Tipos algebraicos

de Nahir Marisol Toledo Olivera -
Número de respuestas: 2

Hola, haciendo los ejercicios de repaso nos surgieron las siguientes dudas:

Dadas las siguientes definiciones:

class Dummy a where
  dummy :: a
instance Dummy Char where
  dummy = 'a'
pre cs = (dummy, dummy : '-' : cs)


¿Cuál de las siguientes afirmaciones es correcta?

Seleccione una:
a. No compila.
b. El tipo de pre es pre :: Dummy a => [Char] -> (a, [Char])
c. El tipo de pre es pre ::  [Char] -> (a, [Char])
d. El tipo de pre es pre :: Dummy a => [a] -> (a, [a])
e. El tipo de pre es pre :: (Dummy a, Dummy Char) => [Char] -> (a, [Char]) 

En este caso la respuesta correcta es la b.

En cambio en este ejercicio:


class Dummy a where
  dummy :: a
instance Dummy Char where
  dummy = 'a'
pre cs = dummy : '-' : cs


¿Cuál de las siguientes afirmaciones es correcta?

Seleccione una:
a. No compila. 
b. El tipo de pre es pre :: [Char] -> [Char]
c. El tipo de pre es pre :: Dummy a => [a] -> [a]
d. El tipo de pre es pre :: Dummy a => [Char] -> [Char]
e. El tipo de pre es pre :: Dummy Char => [Char] -> [Char]

En este ejercicio la opcion correcta es la b. 

No me estaria quedando claro porque las respuestas son esas.

Agradezco explicacion. Saludos. y gracias

En respuesta a Nahir Marisol Toledo Olivera

Re: Ejercicio de repaso - Tipos algebraicos

de Marcos Viera - InCo -
Explico primero el más simple:
pre cs = dummy : '-' : cs


de el contexto en que aplico dummy, puedo deducir que el resultado tiene que ser de tipo `Char`, dado que hago un `(:)` con un `[Char]`. Entonces tengo que fijarme si hay una instancia `Dummy Char`. Como la instancia existe, las restricciones quedan resueltas y el tipo es:

pre :: [Char] -> [Char] 


dado que toma un `[Char]`, que es `cs`, y retorna un `[Char]`.

Ahora sabiendo eso, cuando tenemos:
pre cs = (dummy, dummy : '-' : cs)


el tipado de la segunda componente del par que se retorna ya lo razonamos de la parte anterior. Lo que nos queda por saber es cuál es el tipo de la primera componente. Tengo una llamada a `dummy`, pero nada en el contexto me liga a ningún tipo. Por lo que el resultado puede ser de cualquier tipo `a`, siempre y cuando sea instancia de `Dummy`. Entonces, en resumen, tengo:

pre :: Dummy a => [Char] -> (a, [Char])