2

こんにちは、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
            )

今ではうまくいきます。ありがとう

4

1 に答える 1

4

誤解を招くデザインだと思います。例外をスローする可能性がある唯一のアクションに catch-clause を分離するようにしてください。たとえば、c を読み取っても例外が発生しない場合は、catch 句を分離してみませんか?

于 2011-07-25T12:57:25.397 に答える