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.
On 08/18/10 11:30, Dan Doel wrote: > Consider, for instance: > > multLoop = multLoop > multLoop' = \acc0 -> let acc1 = (*) 3 acc0 in multLoop' acc1 > > These are also extensionally equal functions. multLoop is trivially bottom, > while multLoop' keeps an ever-increasing (or, repeatedly overflowing) > accumulator, but never returns. These are essentially the same as the world- > passing loops above, but there's certainly no temptation to say they are not > equal. I wouldn't say that they are equal at all. They are *extensionally* equal, but they aren't equal. Cheers, Greg _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe