Mutually recursive structures

Timothy Docker timd@macquarie.com.au
Tue, 17 Oct 2000 12:30:58 +1100 (EST)


The following problem has been taxing me....

I have a list of pairs that I have parsed from a input file, which
represent a hiirarchy, where the first element is the name of the object,
and the second is the name of the parent if there is one:

     type ParseOutput = [(String,Maybe String)]


I wish to convert this to a list of "objects", where from each object I can
navigate to the parent object (if any), or the children (if any):

    data Obj = Obj { name::String,
                     parent::(Maybe Obj),
                     children::[Obj] }

    type Result = [Obj]

    convert:: ParseOutput -> Result

In a language with mutable references, this would be a relatively
straightforward. I would just create a dictionary mapping from name to
Obj, and then iterate over them, filling in the parents and children
where appropriate.

    odict = {}
    for (name,parent) in parseOutput:
        odict[name] = Obj()

    for (name,parent) in parseOutput:
        if parent:
            parent = odict[parent]
            child  = odict[name]
            child.parent = parent
            parent.children.append( child )

This gives away my background! How can I do this in Haskell? If I
don't have mutable references, I figure that I must need to use
laziness in some way, perhaps similar to how I would build an infinite
structure.

A hint or two would be great.

Tim