On Fri, Mar 26, 2010 at 11:07 AM, Edward Kmett <ekmett@gmail.com> wrote:
On Fri, Mar 26, 2010 at 11:04 AM, Edward Kmett <ekmett@gmail.com> 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 <dave@zednenem.com> <http://www.eyrie.org/~zednenem/>