我有一个需要迭代的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控制结构呢?
答案 0 :(得分:2)
要回答最初的问题,你在国家monad本身“重新发明”状态monad!您可以将显式线程化的内容移动到您的状态,以避免直接传递它。另一方面,对于像这样的简单事情,我可以明确地传递信息,并且经常发现它更清晰。
最后,正如Daniel Wagner指出的那样,为了提高效率,你应该尽可能地从顶部推出并弹出。