Haskell 动作中无可辩驳的模式?
在我的应用程序中,几个线程修改相同的数据。虽然在“正常”情况下总是会有一条消息,但我发现,由于数据量非常大,在运行Haskell 动作中无可辩驳的模式?,haskell,Haskell,在我的应用程序中,几个线程修改相同的数据。虽然在“正常”情况下总是会有一条消息,但我发现,由于数据量非常大,在运行loopAction之前,其他线程可能会更快并删除messages transMit :: Socket -> POSIXTime -> String -> TPSQ -> TMap -> IO () transMit s time newmsgs q m = do loopAction <- atomically $ do
loopAction
之前,其他线程可能会更快并删除messages
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
但是它当然不起作用,因为一个分支返回()而另一个分支返回IO(),等等。。解决此问题的最佳方法是什么?这将修复类型错误:
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
当然不能被其他线程修改…这应该可以修复类型错误:
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
当然不能被其他线程修改…@JFritsch抱歉,在看到您的评论之前,我添加了我的答案。我的回答还有一部分我解释得不够好吗?哪一部分?@JFritsch抱歉,我在看到你的评论之前补充了我的答案。我的回答还有一部分我解释得不够好吗?哪一部分?顺便问一下,do{m顺便问一下,do{m