[Haskell] Trying to get a Composite design pattern to work

Asfand Yar Qazi ayqazi at gmail.com
Mon Mar 13 17:07:07 EST 2006


On 3/13/06, Greg Buchholz <haskell at sleepingsquirrel.org> wrote:
> Asfand Yar Qazi wrote:
> > I'm trying to implement hierarchical states in Haskell, following on from my
> > work at doing them in C++.
> >
> > Here's what I've got so far:
> >
> > data StateNode a        = CompositeState [ StateNode a ] | State a
> > stateslist :: StateNode a -> [a]
> > stateslist(State x) = [x]
> > stateslist(CompositeState xs) = {- return list of objects of type a -}
> >
> > The following give errors (as they should)
> > -- stateslist(CompositeState xs) = [ stateslist(x) | x <- xs ]
> > -- stateslist(CompositeState xs) = map stateslist xs
> >
> > You see what I'm trying to do?  This is how I want it to behave:
> >
> > sm1         = CompositeState [ State 1, State 2, State 3 ]
> > stateslist(sm1)
> >       => [1, 2, 3]
>
> Maybe...
>
>     stateslist :: StateNode a -> [a]
>     stateslist (State x) = [x]
>     stateslist (CompositeState xs) = concatMap stateslist xs
>
> Greg Buchholz

Actually, I'm trying to avoid library functions, so I can learn the
language and the functional way of thinking.  How would one implement
the concatMap function?

Thanks


More information about the Haskell mailing list