
On Fri, Mar 26, 2010 at 11:07 AM, Edward Kmett
On Fri, Mar 26, 2010 at 11:04 AM, Edward Kmett
wrote: -- as long as you're ignoring 'seq' terminateSeq :: a -> Unit terminateSeq a = a `seq` unit
Er ignore that language about seq. a `seq` unit is either another bottom or undefined, so there remains one canonical morphism even in the presence of seq (ignoring unsafePerformIO) =)
It all depends on how you define equality for functions. If you mean
indistinguishable in contexts which may involve seq, then there are at
least two values of type Unit -> ().
foo :: (Unit -> ()) -> ()
foo x = x `seq` ()
foo terminate = ()
foo undefined = undefined
Even this uses the convention that undefined = error "whatever" =
loop, which isn't technically true, since you can use exception
handling to write code which treats them differently.
--
Dave Menendez