Tengo un módulo donde se crea e inicializa un entorno global (que define ciertas restricciones como direcciones IP contiguas, etc.) llamando a una función de inicialización. Varias funciones posteriores deben usar estas restricciones cuando se invocan.Variables globales y la mónada del lector
Si bien, en principio, entiendo lo que hace la mónada del lector, no estoy muy seguro de cómo puedo aplicar esto a mi problema, esp.
cómo se puede utilizar para inicializar un entorno que está definido por el usuario y pasa como datos/argumentos de la función de inicialización. Quiero decir, la mónada del lector tiene que obtener los valores reales que componen el entorno global inmutable de algún lado. Me gustaría que los valores se leen de una llamada a la función de inicialización como
myinitial :: arg1 -> arg1 -> IOString
donde posteriormentearg1
yarg2
vuelto global de datos inmutables accesibles a las funciones posteriores a través de la mónada lector (?)¿Cómo puedo utilizar estos valores de entorno como argumentos de funciones p.ej
recvFrom s arg1
dondearg1
son datos globales inmutables de mi entorno. Oif arg2 > arg1 then ... else ...
que podría hacer un archivo de configuración, por supuesto, pero creo que un archivo de configuración quitará a mucha flexibilidad.
[Editar] Entiendo acerca de preguntar, pero ¿no debería haber formas adicionales "parecidas a las de un punto" para que el global/entorno inmutable pueda omitirse si la firma de la función se ha definido, ¿verdad? ¿Cómo podría, por ejemplo, tener que refactorizar mi if-then-else para aplicar this?
Funciona parcialmente, como se menciona en la pregunta, tengo un ** módulo ** que tiene varias funciones; entre ellos hay una función de inicialización que crea el ambiente. Las funciones del módulo que se llaman más tarde deben usar el entorno. ¿Es eso posible con la mónada del lector? –
Pero, ¿cómo debería funcionar esto? En su/mi ejemplo, la función de inicializador diría algo como 'let config = Config blabla' y una función posterior tendría que hacer' let result = runReader example config'; - Sin embargo, la función siguiente no conoce 'config'. –
Mira [esta esencia] (https://gist.github.com/2924160) que contiene un ejemplo simple. En el módulo 1, definimos una función que inicializa un entorno global y algunas funciones que dependen del entorno global. El Módulo 2 solo contiene una función principal que inicializa el entorno, y llama a las funciones que dependen de él utilizando 'runReader' (** Edit: ** disculpas, eliminé el comentario original que contestó y lo reemplacé con este). –