In welchen Situationen sollte liftIO
verwendet werden? Wenn ich ErrorT String IO
verwende, arbeitet die lift
Funktion, um IO-Aktionen in ErrorT
zu heben, so scheint liftIO
überflüssig zu sein.Haskell: Aufzug vs LiftIO
Antwort
lift
hebt immer von der "vorherigen" Schicht ab. Wenn Sie von der zweiten Schicht abheben müssen, benötigen Sie lift . lift
und so weiter.
Auf der anderen Seite hebt liftIO
immer von der IO-Schicht (die, wenn vorhanden, immer auf der Unterseite des Stapels ist). Also, wenn Sie mehr als 2 Schichten von Monaden haben, werden Sie schätzen liftIO
.
den Typ des Arguments in den folgenden lambdas vergleichen.
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 ist nur eine Verknüpfung zu dem IO Monade, je nachdem, was die Monade Sie sind im Grunde gleich liftIO eine variable Anzahl von Aufzügen zu verwenden . Das klingt zunächst überflüssig, aber die Verwendung von liftIO hat einen großen Vorteil: Es macht Ihren IO-Code unabhängig von der tatsächlichen Monad-Konstruktion, so dass Sie denselben Code wiederverwenden können, unabhängig von der Anzahl der Layer, aus denen Ihre endgültige Monade besteht beim Schreiben eines Monade-Transformators).
Auf der anderen Seite kommt LiftIO nicht kostenlos, wie Lift tut: die Monade-Transformatoren, die Sie verwenden, müssen Unterstützung dafür haben, z. Die Monade, in der Sie sich befinden, muss eine Instanz der MonadIO-Klasse sein, aber die meisten Monaden heutzutage (und natürlich prüft der Typ-Checker das zur Kompilierzeit für Sie: das ist die Stärke von Haskell!).
- 1. liftIO anstelle der Komposition lift
- 2. Parsec und liftIO, Kompilierungsfehler
- 3. Haskell Operator vs Funktion Vorrang
- 4. Haskell: Algebraische Daten vs Tuple
- 5. Haskell Unterstrich vs. explizite Variable
- 6. Aufzug: testCond - wie es funktioniert?
- 7. Aufzug Tracking ein angemeldeter Benutzer
- 8. Aufzug Fehlerwert ErrorT Monade Transformator
- 9. Aufzug mit Enterprise Java Beans
- 10. Verständnis $ in Haskell
- 11. Haskell Karte/Zip Vs. Liste Verständnis
- 12. Kann Haskell Ints vs. Integers ignorieren?
- 13. (ML) Module vs (Haskell) Typ Klassen
- 14. C vs Haskell Collatz Vermutung Geschwindigkeit Vergleich
- 15. Haskell monad vs applicative Instanz von Funktionen
- 16. foldr vs foldr1 Verwendung in Haskell
- 17. Haskell vs. Erlang: Unterschied in Foldl?
- 18. Mein Haskell-Programm ist zu faul
- 19. Aufzug nicht den Wert neu schreiben
- 20. Erhalte Aufzug Quellen von Maven Repository
- 21. Aufzug RewriteResponse nicht finden eine gültige URL
- 22. definieren TH Aufzug Instanzen für algebraische Datentypen
- 23. Polymorphe Funktionen in Datensatztypen Haskell
- 24. Typen stimmen nicht überein, sollte ich unbedingt liftIO verwenden?
- 25. Haskell: generische IORef, MVar?
- 26. Haskell: Überlappende Instanzen
- 27. Memoizing IO Computations in Haskell
- 28. Pattern Match in Funktionsargument in Haskell
- 29. Die Bedeutung von <= vs. => in Haskell
- 30. In Bezug auf Haskell Typklassen (Num vs Read)
Normalerweise werde ich 'liftIO' verwenden, um auf die IO-Ebene zu heben, auch wenn' lift' ausreichend ist, weil ich dann den Monad-Stack ändern kann und der Code immer noch funktioniert. –
@John: guter Punkt. Und es macht auch deutlich, dass Sie IO und nicht irgendeine andere Monade heben. –