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

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top