Strictness making it worst?

Jorge Adriano jadrian@mat.uc.pt
Sat, 1 Dec 2001 15:58:47 +0000


> How high can you go with fibac before getting a stack overflow?  I'm
> guessing that it's no more than 200000, and that the suspensions have
> the following structure.

100 000 works fine
110 000 stack overflow

>
>     fibac (as you described):
>
>         c = (+) a b
>         d = (+) b c
>         e = (+) c d
>
>     sfibac:
>
>         c = ($!) ((+) a) b
>         d = ($!) ((+) b) c
>         e = ($!) ((+) c) d
>
> i.e. the ($!) is in the wrong place, and is only making the suspension
> twice as deep.  Addition is already strict in both its parameters.

correct, dumb mistake,  thanks :)


> > sfibac' n (a,b) | n == 0    = (a,b)
> >                 | otherwise = sfibac' (n-1) ((,) b $! a+b)

Yeap, got it.



Well, in fact my first aproach was  not using pairs:
> sfibac2                     :: IntPos -> IntPos -> IntPos -> IntPos
> sfibac2 n a b | n == 0    = a 
>               | otherwise = sfibac2 (n-1) b $! (a+b)


With pairs I thought I'd write 
> dumbfibac                     :: IntPos -> IntPos -> IntPos -> IntPos
> dumbfibac n a b | n == 0    = a 
>               | otherwise = dumbfibac (n-1)  $! (b,(a+b))

But this would obviously not work because ($!) reduces its 2nd argument to 
'head normal form', not 'normal form'.
Anyway IMO it looks way much better then yours sfibac' function :-)
So my question is, is there anyway to force an argument to be reduced to 
*normal form*?

a strict fold function defined like,
> sfoldl f a []     = a
> sfoldl f a (x:xs) = (sfoldl f $! (f a x)) xs

would have the same problem as my dumbfibac function.
How do you correctly define a strict fold function?

J.A.