On Dec 22, 2007 12:06 AM, Stefan O'Rear <[EMAIL PROTECTED]> > > 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 _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe