What semantics would you like Haskell to have, in which (x `seq` y
`seq` e) and (y `seq` x `seq` e) are not equal?
I can easily imagine that (x `seq` y `seq` e) might have *two*
semantic
denotations: bottom (Exception: stack overflow), and e. And I would
like
to be able to choose which one I get (please). This is the declared
purpose of seq, namely "to improve performance by avoiding unneeded
laziness".
I'm afraid I don't really comprehend what you're getting at. What
do you mean by an expression having two semantic denotations, and
how would you like to choose which one you get? And I'm baffled by
the mention of stack overflow, where does that come in?
Whether it is a stack overflow, or some other kind of resource-related
exception like out-of-memory, or too-many-open-file-handles, does not
really matter. As you were saying, semantically they are all just
bottom.
My real point is that seq looks for all the world like it is intended
to affect the operational behaviour of a program, yet some people
insist that it is a purely denotational device, and that operational
questions are not relevant. The Report hints that using seq can
"improve performance" (although the opposite is also true), and
changes in performance are certainly an operational notion. Yet I
think it would be valid to say that seq can turn a non-terminating
(exceptioning) program into a terminating one.
Regards,
Malcolm
_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-prime