Domanda

Ciao ho bisogno di funzione di scrittura che inviano e ricevono messaggi su TCP e riconnessione automatica se la connessione è rotto. I messaggi vengono prese da STM Canale

f ch a b = 
    h <- connectTo a b
    forever $ do
        c <- atomically $ readTChan ch
        {- do smth with c -}
    `catch` (const $ f ch a b)

Il mio problema è che, se il collegamento è rotto sarò perso 'c' che ho letto dal canale. Così nella clausola catch voglio nessun qualcosa come unGetTChan ma in questo codice 'c' non è in fermo. Potete raccomandare '' haskellic '' modo di fare una cosa simile?

aggiornamento dopo il messaggio di FUZxxl

Dopo il commento di FUZxxl ho funzione riscritto in forma successivo

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
            )

ora funziona per me. grazie

È stato utile?

Soluzione

Penso che tu abbia un design missleading. Cercare di separare a catch-clausola per l'unica azione che può generare un'eccezione. Per esempio, se la lettura c non può causare un'eccezione, perché non separare i catch-clausole?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top