> For each call, I believe.  An exception might be if the call to nco is
> inlined into the calling function, but this is unlikely as nco is
> recursive.
> 
> So, you're probably better off with:
> 
> > nco wn = nco'
> >     where wn'  = cis wn
> >           nco' = 1 : map (wn'*) nco'
> 
> In which case it will only be evaluated once.

The original version should also evaluate the expression 'cis wn' only
once:

> nco    :: RealFloat a => a -> [ Complex a ]
> nco wn = 1 : map ((*) (cis wn)) (nco wn)

You can verify this using an appropriate semantics for lazy evaluation.
However, another way to think about it is to consider the expression

        (*) (cis wn)

as

        (let x = cis wn in (*) x)

which when first evaluated will create a suspension for x in the heap,
and return
        
        \y -> (*) y x

as its value.  So x only gets allocated/evaluated once.

Cheers,
        Simon
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to