G'day all.

On Mon, Jul 07, 2003 at 04:04:17PM +0100, Sarah Thompson wrote:

> > I would also need to implement efficient indexes into the data structure 
> > -- flat searching will be too slow for non-trivial amounts of data. In 
> > C++, I'd implement one or more external (probably STL-based) indexes 
> > that point into the main data structure.

I replied:

> The direct Haskell equivalent is to use Refs; either IORefs or
> STRefs.  (I'd personally use IORefs, but that's because I like
> having IO around.)  Dereferencing an IORef is a constant-time
> operation, just like chasing a pointer in C.

I forgot to give an example. :-)

Suppose you want some kind of electronic circuit, as you suggested.
Abstractly, you want something like this:

        data Node
          = Node NodeState [Component]

        data Component
          = Resistor ResistorCharacteristics Node Node
          | Transistor TransistorCharacteristics Node Node Node
          | {- etc -}

You can make this indirect in introducing refs:

        type NodeRef = IORef Node
        type ComponentRef = IORef Component

        data Node
          = Node NodeState [ComponentRef]

        data Component
          = Resistor ResistorCharacteristics NodeRef NodeRef
          | Transistor TransistorCharacteristics NodeRef NodeRef NodeRef

The data structures are mutable:

        getNodeState :: NodeRef -> IO NodeState
        getNodeState node
          = do  Node state _ <- readIORef node
                return state

        setNodeState :: NodeRef -> NodeState -> IO ()
        setNodeState node state
          = do  modifyIORef (\Node _ cs -> Node state cs) node

and it's straightforward to construct an index into the middle
somewhere:

        type NamedNodeIndex = FiniteMap String NodeRef

Cheers,
Andrew Bromage
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to