a我正在尝试在树上实现一些算法,其中一个步骤是找到节点处理的发现和完成时间(类似于 Tarjan 的 SSC),这是通过全局时间状态完成的。我在 Haskell 中使用由列表和计时器组成的 State 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))