ottenere variabile nella clausola catch
-
25-10-2019 - |
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
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?