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 に答える