我只是将访问集作为一个集,并将其作为参数传递。 对于任何有序类型的集合和整数的超高效集合,都有有效的日志时间实现。
为了表示图,我使用邻接列表,或者使用有限映射将每个节点映射到其后继列表。 这取决于我想做什么。
除了推荐Abelson和Sussman之外,我推荐Chris Okasaki的Purely Functional Data Structures。 我已经与克里斯的论文联系在一起,但是如果您有钱,他会把它扩展成一本好书。
仅出于笑容,这是在Haskell中以连续传递样式进行的有点吓人的反向后置深度优先搜索。 这直接来自Hoopl优化器库:
postorder_dfs_from_except :: forall block e . (NonLocal block, LabelsPtr e)
=> LabelMap (block C C) -> e -> LabelSet -> [block C C]
postorder_dfs_from_except blocks b visited =
vchildren (get_children b) (\acc _visited -> acc) [] visited
where
vnode :: block C C -> ([block C C] -> LabelSet -> a)
-> ([block C C] -> LabelSet -> a)
vnode block cont acc visited =
if setMember id visited then
cont acc visited
else
let cont' acc visited = cont (block:acc) visited in
vchildren (get_children block) cont' acc (setInsert id visited)
where id = entryLabel block
vchildren bs cont acc visited = next bs acc visited
where next children acc visited =
case children of [] -> cont acc visited
(b:bs) -> vnode b (next bs) acc visited
get_children block = foldr add_id [] $ targetLabels bloc
add_id id rst = case lookupFact id blocks of
Just b -> b : rst
Nothing -> rst