¿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.)

Author: David, 2012-10-24

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.

 34
Author: C. A. McCann,
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