2

您好,我需要编写函数,而不是通过 tcp 发送和接收消息,如果连接断开,则自动重新连接。消息取自 STM Channel

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 子句与可能引发异常的唯一操作分开。例如,如果读取 c 不会导致异常,为什么不将 catch 子句分开呢?

于 2011-07-25T12:57:25.397 回答