动作中无可辩驳的模式?

时间:2012-03-18 09:39:16

标签: haskell

在我的应用程序中,多个线程修改相同的数据。虽然在“正常”情况下总是会有消息,但我发现,在messages运行之前,如果有大量数据,其他线程可能会更快并被删除loopAction

transMit :: Socket -> POSIXTime -> String -> TPSQ -> TMap -> IO ()
transMit s time newmsgs q m = do
     loopAction <- atomically $ do
                       mT <- readTVar m
                       qT <- readTVar q
                       let mT' = Map.delete key mT
                       let qT' = PSQ.delete key qT
                       writeTVar q (PSQ.insert key time qT')
                       writeTVar m (Map.insert key [newmsgs] mT')
                       return (let Just messages = Map.lookup key mT in sendq s (B.pack $ unwords messages) "192.168.35.84" 4711)
     loopAction

我在这里尝试了一些案例表达,例如

case (Map.lookup key MT) of
                           Nothing -> return ()
                           _ -> something w IO

但它当然不起作用,因为一个返回()而另一个分支返回IO()等。我最好解决这个问题?

1 个答案:

答案 0 :(得分:3)

这应该修复类型错误:

return $ case Map.lookup key mT of
              Nothing -> return ()
              Just messages -> sendq s (B.pack $ unwords messages) "192.168.35.84" 4711

这样两个分支都会生成IO (),从而导致STM (IO ())整体。

但我不确定在价值方面发生了什么。 mT肯定不能被不同的线程修改......