Haskell: Lift vs liftIO
-
29-09-2019 - |
Frage
In welchen Situationen sollte liftIO
verwendet werden? Wenn ich ErrorT String IO
bin mit, arbeitet die lift
Funktion heben IO Aktionen in ErrorT
, so liftIO
überflüssig scheint.
Lösung
lift
hebt immer von der „früheren“ Schicht. Wenn Sie von der zweiten Schicht zu heben müssen, müssen Sie lift . lift
und so weiter.
Auf der anderen Seite, liftIO
hebt immer von der IO-Schicht (die, falls vorhanden, auf dem Boden ist immer des Stapels). Also, wenn Sie mehr als 2 Schichten von Monaden haben, werden Sie schätzen liftIO
.
Vergleichen Sie die Art des Arguments in den folgenden 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
Andere Tipps
liftIO ist nur eine Verknüpfung zu dem IO Monade, je nachdem, was die Monade Sie sind in. Im Grunde genommen liftIO entspricht einer variablen Anzahl von Aufzügen zu verwenden. Zunächst Das klingt überflüssig, aber unter Verwendung liftIO hat einen großen Vorteil: Es macht Ihr IO-Code indpendent der eigentlichen Konstruktion Monade, so dass Sie den gleichen Code nicht wiederverwenden können die Anzahl der Schicht der endgültigen Monad gebaut wurde von Materie (das ist ganz wichtig wenn ein Monade Transformator zu schreiben).
Auf der ohter Seits liftIO kommt nicht kostenlos, wie Aufzug vorhanden ist: die Monade Transformatoren Sie verwenden Unterstützung dafür haben müssen, z.B. die Monade Sie sind muss eine Instanz der MonadIO Klasse sein, aber die meisten Monaden heute tun (und natürlich wird die Typprüfung dies bei der Kompilierung für Sie prüfen: dass die Stärke von Haskell ist).