Estoy trabajando a través de Write Yourself a Scheme in 48 Hours (estoy hasta aproximadamente 85 horas) y he llegado a la parte sobre Adding Variables and Assignments. Hay un gran salto conceptual en este capítulo, y ojalá hubiera sido hecho en dos pasos con una buena refactorización en el medio en lugar de saltar directamente a la solución final. De todos modos ...Diferencia entre Estado, ST, IORef y MVar
he conseguido perdido con un número de diferentes clases que parecen servir al mismo propósito: State
, ST
, IORef
y MVar
. Los tres primeros se mencionan en el texto, mientras que el último parece ser la respuesta preferida a muchas preguntas de StackOverflow sobre los tres primeros. Todos parecen tener un estado entre invocaciones consecutivas.
¿Qué son cada uno de estos y cómo se diferencian entre sí?
En particular, estas frases no tienen sentido:
En cambio, usamos una función llamada hilos estatales, dejando Haskell gestionar el estado de agregación para nosotros. Esto nos permite tratar variables mutables como lo haríamos en cualquier otro lenguaje de programación, usando funciones para obtener o establecer variables.
y
El módulo de instrucción IOREF le permite utilizar las variables con estado dentro de la mónada IO.
Todo esto hace que la línea type ENV = IORef [(String, IORef LispVal)]
confunda - ¿por qué la segunda IORef
? ¿Qué se romperá si escribo type ENV = State [(String, LispVal)]
?
¿Qué significa M en MVars y T en TVars? Supongo que "Mutable", "Transaccional". Interesante cómo ST significa State Thread. – CMCDragonkai
¿Por qué dices que 'MVar' debe preferirse a' STRef'? 'STRef' garantiza que solo un hilo puede mutarlo (y que no pueden ocurrir otros tipos de E/S) - seguramente eso es mejor si no necesito el acceso simultáneo al estado mutable. –
@CMCDragonkai Siempre he supuesto que M significa mutex, pero no puedo encontrarlo documentado en ningún lado. –