2

我有一个需要迭代的 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))

所以我用显式递归来做这件事,但它看起来很笨重。此外,这似乎是一件很平常的事情。我重新发明了哪些常见的一元控制结构,很糟糕?

4

1 回答 1

2

为了回答最初的问题,您在状态单子本身中“重新发明”了状态单子!您可以将您明确线程化的内容移动到您的状态中,以避免直接传递它。另一方面,对于像这样简单的事情,我明确地传递东西没有问题,而且经常发现它更干净。

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

于 2013-02-03T20:43:13.283 回答