¿Por qué no hay transformador IO en Haskell?
Cada otra mónada viene con una versión transformadora, y por lo que sé la idea de un transformador es una extensión genérica de mónadas. Siguiendo cómo se construyen los otros transformers, IOT
sería algo como
newtype IOT m a = IOT { runIOT :: m (IO a) }
Para lo cual podría hacer aplicaciones útiles en el acto: IOT Maybe
puede hacer una acción IO o nada, IOT []
puede construir una lista que luego puede ser sequence
d.
Entonces, ¿por qué no hay transformador IO en Haskell?
(Notas: He visto este post en Haskell Café, pero no puede darle mucho sentido. Además, la página de Hackage para el transformador ST menciona un problema posiblemente relacionado en su descripción, pero no ofrece ningún detalle.)
1 answers
Considere el ejemplo específico de IOT Maybe
. ¿Cómo escribirías una instancia Monad
para eso? Podrías empezar con algo como esto:
instance Monad (IOT Maybe) where
return x = IOT (Just (return x))
IOT Nothing >>= _ = IOT Nothing
IOT (Just m) >>= k = IOT $ error "what now?"
where m' = liftM (runIOT . k) m
Ahora tienes m' :: IO (Maybe (IO b))
, pero necesitas algo del tipo Maybe (IO b)
, donde most lo más importante the la elección entre Just
y Nothing
debe ser determinada por m'
. ¿Cómo se aplicaría?
La respuesta, por supuesto, es que no lo haría, porque no puede. Tampoco se puede justificar un unsafePerformIO
allí, escondido detrás de una interfaz pura, porque fundamentalmente estás pidiendo un valor puro the la elección del constructor Maybe
depend para depender del resultado de algo en IO
. Nnnnnope, no va a pasar.
La situación es aún peor en el caso general, porque un arbitrario (universalmente cuantificado) Monad
es aún más imposible de desenvolver que IO
.
Por cierto, el transformador ST
que mencionas se implementa de manera diferente a tu IOT
sugerido. Utiliza la implementación interna de ST
como un State
-como mónada usando magic pixie dust primitivas especiales proporcionadas por el compilador, y define un StateT
-como transformador basado en eso. IO
se implementa internamente como un ST
aún más mágico, por lo que un IOT
hipotético podría definirse de una manera similar.
No es que esto realmente cambie nada, aparte de posiblemente darle un mejor control sobre el orden relativo de los efectos secundarios impuros causados por IOT
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-24 20:29:05