monadically迭代Data.Sequence

时间:2012-10-09 02:19:15

标签: haskell state-monad

我有一个需要迭代的Data.Sequence。问题在于它的有状态,并且序列可能会因为所述迭代而增长。

data Chart = Chart {
       charts :: M.Map Int (Seq.Seq RState), --map from position to list of chart states
       ...
} deriving (Show)


processChartSeq :: Int -> Int  -> State Chart ()
processChartSeq chtIndx stIndx = do s <- get
                                    let seq = fromJust $ M.lookup chtIndx (charts s)
                                        rstate = Seq.index seq  stIndx
                                    processState rstate
                                    when (stIndx < Seq.length seq) (processChartSeq chtIndx (stIndx+1))

所以我用明确的递归来做这件事,但看起来很笨拙。此外,这似乎是常见的事情。我重新发明了什么常见的monadic控制结构呢?

1 个答案:

答案 0 :(得分:2)

要回答最初的问题,你在国家monad本身“重新发明”状态monad!您可以将显式线程化的内容移动到您的状态,以避免直接传递它。另一方面,对于像这样的简单事情,我可以明确地传递信息,并且经常发现它更清晰。

最后,正如Daniel Wagner指出的那样,为了提高效率,你应该尽可能地从顶部推出并弹出。