Ich habe eine Funktion mit einem Typ Map Int String -> Proxy() a() Void IO b
. Gerade jetzt ist es await
s, tut was auch immer mit dem Wert, den es bekam, und ruft sich dann wieder auf. Ich möchte es ändern, um State (Map Int String)
zu verwenden, anstatt das als Argument übergeben zu haben, also kann ich einfach forever
verwenden und muss nicht jeden Zweig erinnern, um recurse zu haben. Ich bekomme, dass ich StateT
verwenden muss, um State
mit einer anderen Monade zu kombinieren, aber ich verstehe nicht, wo in dieser Art Unterschrift die StateT
gehört, oder ob ich oder lift
Funktionen wie get
muss. Was ist der richtige Typ für eine Funktion, die sowohl State (Map Int String)
als auch Proxy() a() Void IO b
ist?Wie funktioniert State mit Pipes?
6
A
Antwort
16
Hinweis: Proxy() a() Void = Consumer a
, so werde ich es für diese Antwort als Consumer
beziehen.
Die einfache Möglichkeit besteht darin, Ihre StateT
Monade-Transformer-Schicht außerhalb der Consumer
Schicht und dann sofort ausführen. Hier ein Beispiel:
import Control.Monad (forever)
import Control.Monad.Trans.State.Strict
import Pipes
example :: (Show a) => Consumer a IO r
example = flip evalStateT 0 $ forever $ do
-- Inside here we are using `StateT Int (Consumer a IO) r`
a <- lift await
n <- get
lift $ lift $ putStrLn $ "Received value #" ++ show n ++ ": " ++ show a
put (n + 1)
... und das ist, wie es in Aktion verhält:
>>> runEffect $ each ["Test", "ABC"] >-> example
Received value #0: "Test"
Received value #1: "ABC"
Verwandte Themen
- 1. Named Pipes, mit Fork()
- 2. $ templateCache funktioniert nicht ist State Config-Methode
- 3. State-Muster mit SAX
- 4. Bootstrap Switch Check State funktioniert nicht
- 5. Untermenü Bootstrap .active state funktioniert nicht richtig
- 6. Stop Linq2SQL mit Named Pipes?
- 7. Einfaches Programm mit Pipes hängt
- 8. Wie schreibe ich State Machines mit C#?
- 9. Bash Anonyme Pipes
- 10. Scala State Monade - Kombinieren verschiedener State-Typen
- 11. Beispiel für Named Pipes
- 12. Mehrere Pipes im Subprozess
- 13. State Pattern Design mit OOP
- 14. State Restoration mit mehreren Storyboards
- 15. Browser "Busy State" mit Ajax
- 16. was bedeutet (state = {}) => state bedeutet
- 17. Warum wdiff nicht mit Named Pipes
- 18. Rails Fehlerbehandlung mit AASM State Machine
- 19. Wie die Query-String in Web-Adresse URL in Angular State Router mit State-Go-Methode
- 20. Was sind Named Pipes?
- 21. flex3 button state
- 22. State Monad Bind
- 23. Custom Session State Modul - Verwenden Sie ASP State Service
- 24. C# Sockets vs Pipes
- 25. Tool für .NET wie Yahoo Pipes
- 26. Angular - wie mehrere URL-Parameter zuzugreifen $ state
- 27. Verwenden von Named Pipes asynchron mit StreamWriter
- 28. Chaining Hadoop MapReduce mit Pipes (C++)
- 29. Wie lösen verschachtelte Angular2 Async-Pipes auf?
- 30. C wie exec mit Linux-Befehlen und Pipes zu verwenden
hoffe, das hilft! http://stackoverflow.com/questions/18471706/idiomatic-bidirectional-pipes-mit-downstream-state-without-loss – user3303858