Parcial 2017 | Ejercicio 7

Parcial 2017 | Ejercicio 7

de Daniel Padron Simon -
Número de respuestas: 1

Buenas noches, ¿Cómo están?

Tengo una consulta sobre el ejercicio 7 del parcial de 2017, añado una imagen del ejército a continuación: 



Mis dudas son las siguientes: 

1) Si una tengo monad_1 >> monad 2, siempre se debe cumplir que monad 1 y monad 2 sean del mismo tipo, no? En este caso entiendo que print x es una monad de tipo IO (), por lo tanto, si monaux no tiene el mismo tipo, no hay forma que funcione, independientemente del tipo del parámetro x de monaux. 

2) Porque la opción c está mal?, al no saber nada de m, ¿cómo podemos afirmar que 'm' es de tipo IO? ¿Capaz es una pregunta básica de tipos, pero esto capaz funciona porque como IO es una Monad, entonces la función es compatible para cualquier Monad?


Saludos y gracias, 

Daniel

En respuesta a Daniel Padron Simon

Re: Parcial 2017 | Ejercicio 7

de Alberto Pardo -
Hola Daniel,

Si tenés una composición m1 >> m2 no necesariamente el tipo de m1 y m2 tienen que ser el mismo, dado que el tipo de (>>) es Monad m => m a -> m b -> m b. print efectivamente tiene tipo IO ().

Lo que sucede con la respuesta c) es que si monaux :: Monad m => Int -> m Int entonces significa que es una función genérica en la mónada m, por lo que es válida en particular para la mónada IO. Es lo que ocurre con funciones como liftM, sequence u otras que están definidas para cualquier mónada. Por lo tanto el código compila sin problemas.

Saludos,
Alberto.