Ceci est ma première connaissance avec Monad Transformers, donc la réponse pourrait être évidente. Disons que je suis dans un bloc do de type StateT MyMonad MyType, je veux qu'une autre fonction du même type modifie l'état et renvoie une valeur de type MyMonad MyType. Comment puis-je y parvenir? Je pense que les exemples here le montrent dans guessSession, mais je n'arrive pas à comprendre comment l'appliquer!Résultat de Monad Transformateur Monad
Répondre
Si vous souhaitez utiliser la monade sous-jacente dans un transformateur de monade, vous pouvez utiliser lift
:
lift :: (MonadTrans t, Monad m) => m a -> t m a
Dans ce cas, t
est StateT MyState
et m
est MyMonad
. Ainsi, par exemple:
foo :: StateT MyState MyMonad MyType
foo = do
modify $ \s -> s+1
lift $ doSomethingInMyMonad 42
transformateurs Monad ne sont pas « en couches sur » dans le sens que vous souhaitez retourner une valeur de type MyMonad MyType
à l'intérieur; c'est une transformation plus littérale : ils transforment une monade en une nouvelle qui a la capacité d'exécuter des actions dans la monade transformée. Ainsi, vous pouvez considérer StateT s m
comme la monade régulière State s
, sauf que vous pouvez également utiliser lift
pour exécuter des actions de virage dans m
en actions dans StateT s m
.
Si vous utilisez les transformateurs standards Monad Transformer Library (mtl) comme StateT
, ReaderT
, etc., vous n'avez pas réellement d'utiliser lift
; des choses comme modify
et ask
fonctionnent en toute monad avec le bon transformateur quelque part dans la pile. (Une pile est juste une tour de monades transformées, comme StateT s (ReaderT r IO)
.)
De plus, si vous avez une grande pile avec IO
au fond, il y a une fonction pratique pour soulever une action IO
un nombre quelconque de couches:
liftIO :: (MonadIO m) => IO a -> m a
Ainsi liftIO (putStrLn "Hello, world!")
œuvres dans IO
, StateT Int IO
, ContT r (WriterT [String] IO)
, et ainsi de suite.
(Comme une note supplémentaire, foo
ici est pas vraiment une fonction, un terme plus précis est l'action ou calcul.)
Je pense que je comprends. Juste pour être parfaitement clair. Imaginez que j'ai fait un <- doSomethingInMyMonad 42 avant d'ajouter StateT. Maintenant, je fais un <- lift $ doSomethingInMyMonad 42. Correct? – aelguindy
@aelguindy: Ouais! Si vous avez une section de code qui utilise simplement MyMonad, vous pouvez aussi lever un bloc entier: 'lift $ do ...'. – ehird
Merci! Je ne sais pas si c'est le bon endroit à demander, mais y a-t-il un équivalent à lever mais avec 2 arguments, lift2? * Question stupide! * Trouvé la réponse – aelguindy
- 1. Transformateur Monad pour NonEmptyList?
- 2. Monades dans un contexte de transformateur monad
- 3. Propagation de l'état Monad
- 4. State monad et gtk2hs
- 5. instance Monoid Monad
- 6. sous-jacent parsec Monad
- 7. Haskell Monad Fonctions
- 8. Monad Etat dans OCaml
- 9. Monad avec Scalaz
- 10. Scala générique Monad fonction?
- 11. Exemple de grande pile Monad
- 12. Novice haskell - liaison séquentielle monad
- 13. iSynaptic.Commons et peut-être Monad
- 14. Peut-être monad en elisp
- 15. Comment appliquer une mesure Monad Transformer
- 16. Rangement des monades - transformation de l'application d'un transformateur monad en nouvelle monade type
- 17. Utilisation de la monad du lecteur dans snap (ou, monad transformers dans snap)
- 18. Notation de monad et de Haskell IO
- 19. Existe-t-il une fonction `replicateM` pour la monade interne dans un transformateur monad?
- 20. Utilisation de synonymes de type dans les transformateurs monad
- 21. Comment combiner différentes piles de Monad?
- 22. Transformateurs de Monad: IO et état
- 23. Comment voir le code de Monad Reader?
- 24. Comment ajouter MonadLogger à ma pile de transformateurs monad gratuits?
- 25. Éviter le levage avec les transformateurs Monad
- 26. Contexte printanier en tant que Reader monad
- 27. Composition d'actions monad avec des plis
- 28. mot-clé dynamique permet "peut-être" monad?
- 29. Comment mettre Vector mutable dans l'État Monad
- 30. IO et Peut-être interaction monad
Si vous ne connaissez pas Hoogle: http: // www.haskell.org/hoogle – jberryman