我有一个需要迭代的 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))
所以我用显式递归来做到这一点,但它看起来很笨拙。此外,这似乎是一件很常见的事情。我糟糕地重新发明了哪些常见的一元控制结构?
最佳答案
为了回答最初的问题,您在状态 monad 本身内“重新发明”了状态 monad!您可以将显式线程化的内容移动到您的状态中,以避免直接传递它。另一方面,对于像这样的简单事情,我可以毫无问题地显式传递东西,并且经常发现它更干净。
最后,正如 Daniel Wagner 所说,为了提高效率,您应该尽可能从顶部推送和弹出。
关于haskell - 单子(monad)迭代 Data.Sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12791998/