2012-10-09 46 views
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)) 

所以我用顯式遞歸來做這件事,但它看起來很笨重。此外,這似乎是一件常見的事情。我重新發明了什麼常見的單調控制結構?

+0

你不在國家monad內工作嗎? – Satvik

+1

如果序列只通過追加事物而發生變化,並且您對該序列所做的所有事情都是您展示的查找,那麼您就重新創建了廣度優先搜索(糟糕)。從Hackage抓取隊列實施並享受。 –

+0

+ Satvik,是的,我在州monad工作。 + Daniel Wagner,是的,序列只能通過追加來改變。有沒有隊列實現我應該使用,而不是Data.Sequence? Data.Queue表示不贊成使用Data.Sequence – nont

回答

2

要回答最初的問題,你「重新創造」了狀態monad本身的狀態monad!您可以將顯式線程化的東西移動到狀態中,以避免直接傳遞它。另一方面,對於這樣的簡單事情,我沒有任何問題明確地傳遞,並且經常發現它更清晰。

最後,正如丹尼爾瓦格納指出的那樣,爲了提高效率,您應該儘可能地從頂部推動並彈出。