Diferencia entre State, ST, IORef y MVar

Estoy trabajando a través deEscribe un esquema en 48 horas (Tengo hasta 85 horas aproximadamente) y he llegado a la parte sobreAgregar variables y asignaciones. Hay un gran salto conceptual en este capítulo, y desearía que se hubiera hecho en dos pasos con una buena refactorización intermedia en lugar de saltar directamente a la solución final. De todas formas…

Me he perdido con varias clases diferentes que parecen tener el mismo propósito:State, ST, IORef yMVar. Los primeros tres se mencionan en el texto, mientras que el último parece ser la respuesta preferida a muchas preguntas de StackOverflow sobre los primeros tres. Todos parecen tener un estado entre invocaciones consecutivas.

¿Qué son cada uno de estos y en qué se diferencian entre sí?

En particular, estas oraciones no tienen sentido:

n su lugar, usamos una función llamadastate hilos, permitiendo que Haskell gestione el estado agregado por nosotros. Esto nos permite tratar las variables mutables como lo haríamos en cualquier otro lenguaje de programación, utilizando funciones para obtener o establecer variables.

El módulo IORef le permite usar variables con estado dentro de la mónada IO.

Todo esto hace que la líneatype ENV = IORef [(String, IORef LispVal)] confuso: ¿por qué la segundaIORef? ¿Qué se romperá si escribotype ENV = State [(String, LispVal)] en su lugar?

Respuestas a la pregunta(3)

Su respuesta a la pregunta