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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top