
On Wednesday 18 August 2010 2:50:00 pm Gregory Crosswhite wrote:
On 08/18/10 11:30, Dan Doel wrote:
Now, moving to the two loops: loop = loop loop' = \w0 -> let (w1, ()) = putStr "c" w0 in loop' w1
How are we to distinguish between these? I know of exactly one Haskell function that can do so: seq. And this is only because it can distinguish bottom from const bottom. Extensionally, these are equal functions.
No, the very fact that one is bottom and the other is const bottom demonstrates that they are *not* equal.
I wouldn't say that they are equal at all. They are *extensionally* equal, but they aren't equal.
This distinction is unimportant to the topic being discussed here, though. Rewriting loop to be: loop w = loop w makes it non-bottom, for instance. The fact that seq can distinguish the original loop from loop' does zero work toward explaining why the one is different from the other from the perspective of the effects represented. -- Dan