Dans quelles situations faut-il utiliser liftIO
? Lorsque j'utilise ErrorT String IO
, la fonction lift
fonctionne pour lever les actions E/S en ErrorT
, donc liftIO
semble superflu.Haskell: ascenseur vs liftIO
Répondre
lift
lève toujours de la couche "précédente". Si vous devez soulever de la deuxième couche, vous auriez besoin de lift . lift
et ainsi de suite. D'autre part, liftIO
se lève toujours de la couche IO (qui, lorsqu'elle est présente, est toujours au 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 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
liftIO est juste un raccourci vers l'IO Monad, selon que vous êtes dans le Monad Fondamentalement, liftIO équivaut à utiliser un nombre variable d'ascenseurs . Au premier abord, cela peut sembler redondant, mais utiliser liftIO a un grand avantage: il rend votre code IO indépendant de la construction réelle de Monad pour que vous puissiez réutiliser le même code quel que soit le nombre de couches de votre Monad final. lors de l'écriture d'un transformateur monad). D'autre part, liftIO ne vient pas gratuitement, comme le fait l'ascenseur: les transformateurs Monad que vous utilisez doivent avoir un support pour cela, par ex. La Monade dans laquelle vous êtes doit être une instance de la classe MonadIO, mais de nos jours la plupart des Monades (et bien sûr, le vérificateur de type vérifiera cela pour vous au moment de la compilation: c'est la force de Haskell!).
- 1. ascenseur `??` construire
- 2. Ascenseur mapper afterCreate beforeSave
- 3. Ascenseur avec db4o Modèle d'utilisateur
- 4. Haskell: générique IORef, MVar?
- 5. scala/ascenseur exemple de traitement de formulaire
- 6. ascenseur ne pas réécrire la valeur
- 7. REST dans ascenseur 2.0 + Scala 2.8
- 8. Essayer de comprendre Haskell de => vs définir les types
- 9. Haskell confusion avec ContT, callCC, quand
- 10. Scala ascenseur cadre, formulaire ajax qui soumet plusieurs valeurs?
- 11. Scala et ascenseur et SessionVar qui perd le contenu
- 12. Ascenseur Problème: Rencontrer des erreurs Log4J sur Jetty: Exécuter
- 13. Aide Connexion ascenseur à une base de données Oracle
- 14. ascenseur net.liftweb.http.S # doesnt fonctionne comme param wiki dit
- 15. ascenseur échantillon CalendarMonthView échoue avec Lift 1.1 INSTANTANÉ
- 16. Haskell FlatMap
- 17. permutation haskell
- 18. Haskell & Oracle
- 19. Haskell Liste
- 20. Haskell Conditionals
- 21. haskell tri
- 22. Installations pour générer des types Haskell à Haskell ("second order Haskell")?
- 23. itérations complexes dans haskell
- 24. imbriqué si haskell
- 25. Haskell: grille dans wxHaskell
- 26. Interfaçage haskell avec c
- 27. Opérateur point Haskell
- 28. Accumulateurs à haskell
- 29. composition fonction Haskell question
- 30. Que signifie `~` dans Haskell?
J'utiliserai généralement 'liftIO' pour soulever la couche IO même si' lift 'est suffisant, car alors je peux changer la pile monad et le code fonctionne toujours. –
@John: bon point. Et aussi, il est évident que vous soulevez des E/S et pas n'importe quelle autre monade. –