I am about to rewrite my Z animation tool (JAZA) in a style that
makes more intensive use of state monads.

However, my experiments with a simplified lambda-calculus example
shows that (with GHC 5.00) the state monad is dramatically less
efficient than the simple identity monad:

    4 TIMES SLOWER, and
    7 TIMES MORE MEMORY!

Is this normal?  Acceptable?  Am I doing something wrong?

Can anyone suggest ways of reducing these overheads?

(I am very keen to use state-monads if possible, because it allows
my 'eval' code to be generic over the monad that is used, which
allows me to reuse the code with other similar monads.  In fact,
I am using it to simulate the 'visitor' design pattern from OO langs.)

Hugs gives slightly smaller differences (3 times more reductions and 
3.5 times more cells), but I had hoped that GHC would be able to
optimize most of the state monad overhead away  (especially when
the monad uses newtype)?

My code and speed measurements are attached.

Mark.

LambdaCalc.hs

Reply via email to