Pregunta

¿En qué situaciones debe utilizarse liftIO? Cuando estoy usando ErrorT String IO, las obras de función lift para levantar acciones Io en ErrorT, por lo liftIO parece superflua.

¿Fue útil?

Solución

lift siempre se levanta de la capa de "anterior". Si necesita la elevación de la segunda capa, se necesitaría lift . lift y así sucesivamente.

Por otro lado, liftIO siempre levanta desde la capa de IO (que, cuando está presente, está siempre en la parte inferior de la pila). Por lo tanto, si usted tiene más de 2 capas de mónadas, apreciará liftIO.

Comparar el tipo del argumento en los siguientes lambdas:

type T = ReaderT Int (WriterT String IO) Bool

> :t \x -> (lift x :: T)
\x -> (lift x :: T) :: WriterT String IO Bool -> T

> :t \x -> (liftIO x :: T)
\x -> (liftIO x :: T) :: IO Bool -> T

Otros consejos

liftIO es sólo un acceso directo a la mónada IO, lo que la mónada que se encuentra. Básicamente, liftIO es igual a la utilización de un número variable de ascensores. Al principio esto podría redundante sonido pero utilizando liftIO tiene una gran ventaja: que hace que su código indpendent IO de la construcción real Mónada para que pueda volver a utilizar el mismo código sin importar el número de capa de su última Mónada se ha construido de (esto es muy importante al escribir un transformador mónada).

En el lado ohter, liftIO no está llegando de forma gratuita, como lo hace la elevación: los transformadores Monad que está utilizando deben tener soporte para el mismo, por ejemplo, la mónada que está en debe ser una instancia de la clase MonadIO, pero la mayoría de las mónadas hoy en día hacer (y, por supuesto, el tipo ortográfico comprobará esto para usted en tiempo de compilación: esa es la fuerza de Haskell).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top