<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:277417284;
        mso-list-type:hybrid;
        mso-list-template-ids:680566036 67698705 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I'm doing some xml processing where elements can reference each other in one particular way.<o:p></o:p></p><p class=MsoNormal>Such a reference is resolved by copying the content of the referenced element to the content of the referencing element.<o:p></o:p></p><p class=MsoNormal>For example, <A ref="B">foo</A>, <B>bar</B> would resolve to <A>bar</A><B>bar</B>.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The references can also be nested, for example:<o:p></o:p></p><p class=MsoNormal><A ref="B">foo</A>, <B ref="C">bar</B><C>baz</C> would resolve to <A>baz</A><B>baz</B><C>baz</C>.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I'm looking to collect all the elements with such references in some sort of (tree?) container for efficient resolution.<o:p></o:p></p><p class=MsoNormal>The container should serve two purposes:<o:p></o:p></p><p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span style='mso-list:Ignore'>1)<span style='font:7.0pt "Times New Roman"'>      </span></span><![endif]><span dir=LTR></span>I need to check whether there are any cyclic references (for example, A references B which references C which references A) – which is invalid.<o:p></o:p></p><p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span style='mso-list:Ignore'>2)<span style='font:7.0pt "Times New Roman"'>      </span></span><![endif]><span dir=LTR></span>I need to traverse the tree upwards in order to copy the content from one element to another - beginning with the "leaves" (elements with non-nested references), working up the "branches" (elements with nested references) to the "roots" (elements with references that are not referenced by other elements). Obviously there can be many roots, as well as many leaves that are roots themselves.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I'm not familiar with trees in Haskell at all.  Can anyone provide some guidance on whether there are any existing containers that would be appropriate for checking cyclic dependencies and for reverse traversal?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Renah Scarowsky<o:p></o:p></p><p class=MsoNormal>Suite Solutions<o:p></o:p></p><p class=MsoNormal><i>Create>Manage>Deploy<o:p></o:p></i></p><p class=MsoNormal><a href="http://www.suite-sol.com/"><span style='color:windowtext'>http://www.suite-sol.com</span></a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>