需要帮助来提取变量的值

时间:2019-07-15 20:44:08

标签: haskell functional-programming logic

我想从以下代码中将v的值提取到m2中。

很难理解这些链。我试图长时间了解流程,找不到任何具体解决方案。

m1 <- newEmptyMVar                         
m2 <- newEmptyMVar
forkIO $ do
  g <- view (hasLens . to seed)
  let g' = mkStdGen $ fromMaybe (d' ^. defSeed) g
  execStateT (evalRandT runCampaign g') (Campaign ((,Open (-1)) <$> ts) c d') where
    step        = runUpdate (updateTest v Nothing) >> lift u  >> runCampaign
    runCampaign = use (hasLens . tests . to (fmap snd)) >>= update
    update c    = view hasLens >>= \(CampaignConf tl q sl _ _) ->
      if | any (\case Open  n   -> n < tl; _ -> False) c -> callseq v w q >> step
         | any (\case Large n _ -> n < sl; _ -> False) c -> step
         | otherwise                                     -> lift u

帮助功能

runUpdate :: (MonadState x m, Has Campaign x) => ((SolTest, TestState) -> m (SolTest, TestState)) -> m ()
runUpdate f = use (hasLens . tests) >>= mapM f >>= (hasLens . tests .=)
updateTest :: ( MonadCatch m, MonadRandom m, MonadReader x m, Has TestConf x, Has CampaignConf x)
           => VM -> Maybe (VM, [Tx]) -> (SolTest, TestState) -> m (SolTest, TestState)

我尝试在putMVar m1 v行中包含step,如下所示

step = runUpdate (updateTest v Nothing) >> lift u >> putMVar m1 v  >> runCampaign

我认为这些只是排序,将putMVar m1 v插入之间会产生以下错误。

    parse error (possibly incorrect indentation or mismatched brackets)
    |
192 |       runCampaign = use (hasLens . tests . to (fmap snd)) >>= update
    |       ^


一些额外的信息

campaign u v w ts d = let d' = fromMaybe defaultDict d in fmap (fromMaybe mempty) (view (hasLens . to knownCoverage)) >>= \c -> do
  g <- view (hasLens . to seed)
  let g' = mkStdGen $ fromMaybe (d' ^. defSeed) g
  execStateT (evalRandT runCampaign g') (Campaign ((,Open (-1)) <$> ts) c d') where
    step        = runUpdate (updateTest v Nothing) >> lift u >> runCampaign
    runCampaign = use (hasLens . tests . to (fmap snd)) >>= update
    update c    = view hasLens >>= \(CampaignConf tl q sl _ _) ->
      if | any (\case Open  n   -> n < tl; _ -> False) c -> callseq v w q >> step
         | any (\case Large n _ -> n < sl; _ -> False) c -> step
         | otherwise                                     -> lift u

这是我要处理的代码。

在这里,我想声明一个变量m1 <- newEmptyMVarm2。 然后,我想使用forkIO当前的两个线程上从第二行(到最后)运行代码。

我希望从两个线程中将v存储在m1m2中。这样我就可以手动检查两个线程是否具有相同的v

希望有帮助!

0 个答案:

没有答案