2
我有一個Data.Sequence我需要迭代。問題在於它的有狀態,並且序列可能因所述迭代而增長。一次遍歷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內工作嗎? – Satvik
如果序列只通過追加事物而發生變化,並且您對該序列所做的所有事情都是您展示的查找,那麼您就重新創建了廣度優先搜索(糟糕)。從Hackage抓取隊列實施並享受。 –
+ Satvik,是的,我在州monad工作。 + Daniel Wagner,是的,序列只能通過追加來改變。有沒有隊列實現我應該使用,而不是Data.Sequence? Data.Queue表示不贊成使用Data.Sequence – nont