Holen Sie sich Variable in Catch -Klausel
-
25-10-2019 - |
Frage
Hallo, ich muss eine Funktion schreiben, als Nachrichten über TCP und automatisch wieder zu senden und zu empfangen, wenn die Verbindung unterbrochen wird. Nachrichten stammen vom STM -Kanal
f ch a b =
h <- connectTo a b
forever $ do
c <- atomically $ readTChan ch
{- do smth with c -}
`catch` (const $ f ch a b)
Mein Problem ist, dass ich, wenn die Verbindung gebrochen ist, 'C' verlor, das ich vom Kanal gelesen habe. Also in catch
Klausel Ich möchte nichts wie Ungettchan, aber in diesem Code ist 'C' nicht im Fang. Können Sie '' Haskellic '' so etwas beraten, so etwas zu tun?
Aktualisieren Sie nach der Nachricht von Fuzxxl
Nach Fuzxxls Kommentar habe ich die Funktion in der nächsten Form umgeschrieben
fun ch a b = do
h <- connectTo a b
forever $ do
c <- atomically $ readTChan chan
do
{- do smth with c -}
`catch` (const $ do
atomically $ unGetTChan chan c
fun chan con
)
Jetzt funktioniert es für mich. Danke
Lösung
Ich denke, Sie haben ein Missleading -Design. Versuchen Sie, sich zu trennen, um die einzige Aktion zu fangen, die eine Ausnahme ausgelöst hat. Wenn beispielsweise das Lesen c keine Ausnahme ausführen kann, warum nicht die Fangklauseln trennen?