¿En qué situaciones se debe usar liftIO
? Cuando estoy usando ErrorT String IO
, la función lift
funciona para levantar acciones IO en ErrorT
, por lo que liftIO
parece superfluo.Haskell: ascensor vs liftIO
Respuesta
lift
siempre se levanta de la capa "anterior". Si necesita levantar desde la segunda capa, necesitará lift . lift
y así sucesivamente.
Por otro lado, liftIO
siempre se levanta de la capa IO (que, cuando está presente, siempre está en la parte inferior de la pila). Por lo tanto, si 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
liftIO es sólo un acceso directo a la mónada IO, lo que la mónada que están en el fondo, liftIO es igual a la utilización de un número variable de ascensores . Al principio, esto puede parecer redundante, pero usar liftIO tiene una gran ventaja: hace que tu código IO sea independiente de la construcción de Monad real para que puedas reutilizar el mismo código sin importar la cantidad de capa de tu Monad final (esto es bastante importante) al escribir un transformador de mónada).
En la otra mano, liftIO no está disponible de forma gratuita, como lo hace el ascensor: los transformadores Monad que está utilizando deben tener soporte, por ejemplo. la Mónada en la que te encuentras debe ser una instancia de la clase MonadIO, pero la mayoría de las Mónadas actuales (y, por supuesto, el verificador de tipos comprobará esto en el momento de la compilación: ¡esa es la fuerza de Haskell!).
- 1. Ascensor transformador mónada ErrorT
- 2. Haskell: Listas vs Streams
- 3. Comparación Haskell vs. Prolog
- 4. Haskell: datos algebraicos vs Tupla
- 5. Haskell vs. Python threading model
- 6. Haskell operador vs función precedencia
- 7. ascensor no se construye con sbt?
- 8. Ascensor seguimiento de un usuario conectado
- 9. ¿Puede Haskell ignorar Ints vs. Integers?
- 10. Haskell map/zip vs. lista de comprensión
- 11. tipo vs rendimiento de datos en haskell
- 12. Haskell Static vs Dynamic Linking en Despliegue
- 13. ¿Qué es "levantar" en Haskell?
- 14. cómo leer un archivo de una aplicación web ascensor
- 15. Haskell: genérico IORef, MVar?
- 16. Haskell: casos superpuestos
- 17. Haskell ReaderT Env IO estándar
- 18. Desarrollo de software impulsado por modelos vs. Haskell
- 19. Haskell vs. programación de procedimientos en el mundo real
- 20. lidiando con IO vs código puro en haskell
- 21. tipo Haskell vs. newtype con respecto al tipo de seguridad
- 22. Mezcla de mónadas en Haskell
- 23. ascensor-JSON como dependencia de construcción para la reproducción del proyecto 2.0
- 24. Modelado de un ascensor utilizando análisis y diseño orientado a objetos
- 25. Escribir un intérprete Haskell en Haskell
- 26. Haskell "excepciones"
- 27. Haskell principiante
- 28. en Haskell
- 29. Haskell mochila
- 30. Haskell FlatMap
Generalmente usaré 'liftIO' para levantar a la capa IO incluso si' lift' es suficiente, porque entonces puedo cambiar la pila de mónadas y el código aún funciona. –
@John: buen punto. Y también hace obvio que estás levantando IO y no cualquier otra mónada. –