Dudas sobre ask y get

Dudas sobre ask y get

de Valentina Pereira Ciaffone -
Número de respuestas: 1

Hola!

Me quedó la siguiente duda, por lo que estuve leyendo la mónada State es una instancia de la mónada Reader, entonces State debería de poder usar tanto la función ask como la función get, si no me equivoco. 

ero ahí me pasan dos cosas, cuál sería la diferencia teórica entre estas dos funciones de ser posible usar ambas, y de ser así, por qué cuando intento usarlas obtengo un error de compilación. 

Saludos y gracias!

En respuesta a Valentina Pereira Ciaffone

Re: Dudas sobre ask y get

de Alberto Pardo -
Hola Valentina,

No, State y Reader son dos mónadas diferentes dado que denotan distintas clases de efectos. Reader es también llamada la mónada de environment (ambiente) dado que lo que uno hacer es pasar un ambiente (que puede ser simplemente un valor pero en muchas casos suele ser una cierta estructura) que es usado por las computaciones. Se le llama de "ambiente" porque el uso que se le da es muy semejante a lo que pasa con el ambiente de variables en las reglas de scope en los lenguajes de programación, en el sentido de que uno tiene variables scopes globales y scopes locales. Por ejemplo, lo que pasó con los lets en el lenguaje FUN del laboratorio, pero es similar a lo que pasa en C, Pascal u otros lenguajes con las variables locales y las globales (las variables locales tienen prioridad sobre las globales). En una computación en la mónada Reader uno puede acceder al ambiente y para ello debe ejecutar ask; eso hace visible el ambiente a nivel de la computación (puedo consultarlo por ejemplo, hacer lookup si es una tabla, etc). Por otro lado, puedo tener subcomputaciones donde localmente quiero trabajar con un ambiente modificado. Para eso está la operación local. Una vez que termine esa subcomputación se restablece el ambiente que se tenía antes. Eso es exactamente lo que se hace con las reglas de scoping.

State es una mónada donde se manipula y se va pasando un estado, que puede ser modificado por cada una de las subcomputación. A diferencia de Reader, en State no hay una forma de decir "quiero modificar el estado solo en este contexto local", cada modificación que se haga al estado actúa de forma global. La función get permite mostrar el estado a nivel de la computación para poder consultar o modificarlo, luego está put que establece a partir el estado que se va a manejar de ahi en adelante, olvidando el estado que se tenía en ese momento.

Es posible usar Reader y State digamos juntas, pero no libremente, sino que para eso se debe aplicar un mecanismo especial de composición de mónadas que escapa el alcance del curso de Programación Funcional. Es un mecanismo que damos en la electiva Programación Funcional Avanzada en el 2do semestre.

Saludos,
Alberto.