Question

Dans quelles situations doit liftIO être utilisé? Lorsque j'utilise ErrorT String IO, les travaux de la fonction lift pour soulever des actions dans IO ErrorT, donc liftIO semble superflu.

Était-ce utile?

La solution

lift soulève toujours de la couche « précédente ». Si vous avez besoin pour soulever de la deuxième couche, vous devez lift . lift et ainsi de suite.

Par contre, liftIO soulève toujours de la couche IO (qui, lorsqu'il est présent, est toujours sur le fond de la pile). Donc, si vous avez plus de 2 couches de monades, vous apprécierez liftIO.

Comparer le type de l'argument dans les lambdas suivants:

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

Autres conseils

liftIO est juste un raccourci vers l'IO Monad, selon la Monade que vous êtes. Fondamentalement, liftIO équivaut à utiliser un nombre variable d'ascenseurs. Tout d'abord ce son pourrait redondant mais en utilisant liftIO a un gros avantage: il rend votre code IO indpendent de la construction Monad réelle de sorte que vous pouvez réutiliser le même code, peu importe le nombre de couche votre Monade finale a été construit de (ce qui est très important lors de l'écriture d'un transformateur de monade).

Sur la main ohter, liftIO ne vient pas gratuitement, comme ascenseur fait: les transformateurs Monad que vous utilisez doivent avoir un soutien pour elle, par exemple la Monade vous êtes doit être une instance de la classe MonadIO, mais la plupart des Monades ne aujourd'hui (et bien sûr, le type vérificateur vérifiera pour vous au moment de la compilation: qui est la force de Haskell).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top