получить переменную в предложении catch - PullRequest
2 голосов
/ 25 июля 2011

Здравствуйте, мне нужно написать функцию, которая будет отправлять и получать сообщения через TCP и автоматическое переподключение, если соединение разорвано.Сообщения взяты из канала STM

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

Моя проблема в том, что если соединение разорвано, я потеряю 'c', которую я прочитал из канала.Поэтому в предложении catch я не хочу ничего похожего на unGetTChan, но в этом коде 'c' не в зацеплении.Можете ли вы посоветовать '' haskellic '' способ сделать такую ​​вещь?

обновить после сообщения FUZxxl

После комментария FUZxxl я переписал функцию в следующую форму

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
            )

теперь это работает для меня.спасибо

1 Ответ

4 голосов
/ 25 июля 2011

Я думаю, у вас неправильный дизайн.Попробуйте отделить catch-условие от единственного действия, которое может вызвать исключение.Например, если чтение c не может вызвать исключение, почему бы не разделить предложения catch?

...