[Haskell-cafe] Why does this blow the stack?
Luke Palmer
lrpalmer at gmail.com
Sat Dec 22 03:15:41 EST 2007
On Dec 22, 2007 12:06 AM, Stefan O'Rear <stefanor at cox.net> > > The
explicit loop you're talking about is:
> > enumDeltaInteger :: Integer -> Integer -> [Integer]
> > enumDeltaInteger x d = x : enumDeltaInteger (x+d) d
> > That code isn't very complicated, and I would hope to be able to write
> > code like that in my own programs without having to worry about
> > strictness. Given that the compiler even has an explicit signature,
> > why can't it transform that code to
> > enumDeltaInteger x d = let s = x + d in x : (seq s $ enumDeltaInteger s d)
> > since it knows that (Integer+Integer) is strict? Of course, improving
> > the strictness analysis is harder, but it pays off more, too.
>
> Because they simply aren't the same.
>
> Try applying your functions to undefined undefined.
This took a little work for me to see. Here it is for the interested:
Prelude> let edi :: Integer -> Integer -> [Integer]; edi x d = x : edi (x+d) d
Prelude> let edi' :: Integer -> Integer -> [Integer]; edi' x d = let s
= x + d in x : (seq s $ edi s d)
Prelude> _:_:_ <- return $ edi undefined undefined
Prelude> _:_:_ <- return $ edi' undefined undefined
*** Exception: Prelude.undefined
Luke
More information about the Haskell-Cafe
mailing list