Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 动作中无可辩驳的模式?_Haskell - Fatal编程技术网

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