84 votes

Haskell: ascenseur vs liftIO

Dans quelles situations doit liftIO - ils être utilisés? Quand je suis à l'aide d' ErrorT String IO, lift fonction sert à soulever IO actions en ErrorT, alors liftIO semble superflu.

96voto

Roman Cheplyaka Points 15145

lift toujours des ascenseurs de l' "précédent" de la couche. Si vous avez besoin de lever de la deuxième couche, vous auriez besoin d' lift . lift et ainsi de suite.

D'autre part, liftIO toujours des ascenseurs de l'OI de la couche (qui, lorsqu'il est présent, est toujours sur le bas de la pile). Donc, si vous avez plus de 2 couches de monades, vous apprécierez liftIO.

Comparer le type de l'argument dans la suite 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

39voto

Cristiano Paris Points 690

liftIO est juste un raccourci pour le IO Monade, selon la Monade. Fondamentalement, liftIO est égal à l'aide d'une variable le nombre de remontées mécaniques. Au premier abord cela peut sembler redondant, mais à l'aide de liftIO a un gros avantage: il permet à vos IO code indpendent de la réelle Monade de construction de sorte que vous pouvez réutiliser le même code, peu importe le nombre de couche de finale de la Monade a été construit (ce qui est assez important lors de l'écriture d'une monade transformateur).

Sur les autres centres de la main, liftIO n'est pas gratuit, ascenseur n': la Monade transformateurs que vous utilisez doit prendre en charge, par exemple, la Monade vous êtes dans doit être une instance de la MonadIO classe, mais la plupart des Monades de nos jours (et bien sûr, le type-checker va vérifier cela pour vous au moment de la compilation: c'est la force de Haskell!).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X