haskell - 单子(monad)迭代 Data.Sequence

标签 haskell state-monad

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

相关文章:

haskell - Haskell 中的帕斯卡三角形

haskell - 混合解析器字符(词法分析器?)与解析器字符串

haskell - 如何向此 monad 转换器添加列表或 List?

Haskell State Monad 和 Binary 不输出所有内容

algorithm - 在 Haskell 中使用 State monad 进行广度优先搜索

Scalaz 状态 monad 示例

haskell - 手动推导类型 `(.) (foldr(++)) (map (:))`

haskell - Haskell 中叶子的数量比节点的数量大 1

haskell - 如何将字符串分割成 block 并创建这些 block 的列表 haskell