Prueba 2016 (segunda instancia) - ejercicio 10

Prueba 2016 (segunda instancia) - ejercicio 10

de Esteban Gabriel Risso Martinez -
Número de respuestas: 3

Buenas, no tengo mucha idea de como sacar el tipo de la monada. Alguien me puede explicar los pasos?

 ejercicio 10

Gracias. 

    Saludos.

En respuesta a Esteban Gabriel Risso Martinez

Re: Prueba 2016 (segunda instancia) - ejercicio 10

de Marcos Viera - InCo -
El hecho de que sea una mónada no agrega complejidad al problema de inferir el tipo, lo que tenés que tener en cuenta es que:

 
(>>=) :: Monad m => m a -> (a -> m b) -> m b
return :: Monad m => a -> m a


Algo más que hay que tener en cuenta en este caso es que tenés ``(x : y)``, sabiendo que:

 
(:) :: a -> [a] -> [a]


Fijate si podés sacarlo con esta información, sino la seguimos por acá.
En respuesta a Marcos Viera - InCo

Re: Prueba 2016 (segunda instancia) - ejercicio 10

de Esteban Gabriel Risso Martinez -

Esto es lo que tengo hasta ahora:

  1. en la expresión (a >>= \x -> return b >>= \y -> return (x:y)) estoy aplicando (>>=) a: a y (\x -> return b >>= \y -> return (x:y)) por lo tanto mirando el tipo de (>>=) se puede deducir que el tipo de a debe ser m t1 y la expresión (\x -> return b >>= \y -> return (x:y)) tiene tipo t1 -> m b.
  2. como el parámetro que recibe la función (t1 -> m b) se asocia a x por la lambda abstracción x tiene tipo t1.
  3. de (x:y) podemos deducir que como x es de tipo t1 entonces y es de tipo [t1].
  4. el tipo de return (x:y) es return (x:y):: Monad m -> m [t1].


esta bien el razonamiento? lo que no saco es el tipo de b.