質問

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

今、それは私のために働いています。ありがとう

役に立ちましたか?

解決

あなたは誤ったデザインを持っていると思います。例外をスローする可能性のある唯一のアクションにキャッチクローズに分離してみてください。たとえば、Cを読むことが例外を引き起こすことができない場合、漁獲量を分離してみませんか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top