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.
Réponses
Trop de publicités?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
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!).