a我正在尝试在树上实现一些算法,其中一个步骤是找到节点处理的发现和完成时间(类似于Tarjan的SSC),这是通过全局时间状态完成的。我在Haskell中使用由列表和计时器组成的状态monad。然而,在较大的树上,我会在这部分代码上出现堆栈溢出和性能下降的问题,你能提出改进的建议吗?
data DfsState = DfsState { timer :: Int
, treel :: [(Int, Int, Int)]
}
incTimer state = state { timer = timer state + 1 }
addElem node discovery finish state = state { treel=(node,discovery,finish):treel state }
dfs :: Node -> Node -> State DfsState ()
dfs node parent = do
modify incTimer
discovery <- gets timer
mapM_ (flip dfs node) . filter (/= parent) $ graph M.! node
finish <- gets timer
modify (addElem node discovery (finish + 1))