मैं बस सेट के रूप में विज़िट सेट रखता हूं और इसे पैरामीटर के रूप में पास करता हूं। किसी ऑर्डर किए गए प्रकार और पूर्णांक के अतिरिक्त-कुशल सेट के सेट के कुशल लॉग-टाइम कार्यान्वयन हैं।
ग्राफ का प्रतिनिधित्व करने के लिए मैं आसन्नता सूचियों का उपयोग करता हूं, या मैं एक सीमित नक्शा का उपयोग करूंगा जो प्रत्येक नोड को अपने उत्तराधिकारी की सूची में मैप करता है। यह निर्भर करता है कि मैं क्या करना चाहता हूं।
एबेलसन और सुस्मान की बजाय, मैं क्रिस ओकासाकी के Purely Functional Data Structures की सलाह देता हूं। मैंने क्रिस के शोध प्रबंध से जुड़ा हुआ है, लेकिन यदि आपके पास पैसा है, तो उसने इसे excellent book में विस्तारित किया।
बस grins के लिए, यहाँ एक थोड़ा डरावना रिवर्स क्रंमोत्तर गहराई-प्रथम हास्केल में निरंतरता-गुजर शैली में किया खोज है। यह सीधे 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
स्रोत
2010-06-08 22:58:32
मैं कार्यात्मक ग्राफ पुस्तकालय पेज से इन कड़ियों खींच लिया: इस सिद्धांत बताते हैं: http://web.engr.oregonstate.edu/~erwig/papers/abstracts.html#JFP01 यह प्रोग्रामिंग विवरण दस्तावेजों: http://web.engr.oregonstate.edu/~erwig/fgl/haskell/old/fgl0103.pdf साथ में, ये कागजात मेरे प्रश्न का उत्तर देते हैं, दूसरे का कण, जो थोड़ा और व्यावहारिक है। धन्यवाद! – brad