George Russel wrote:
[snip]
> I presume it would not in fact be difficult to synthesise a left identity at
> the cost of making things slower, thus (forgive any syntax errors, I'm not going to
> test this).
> 
> data MonadIO a = Action (IO a) | Return a
> instance Monad (MonadIO a) where
>    return a = Return a
>    (>>=) (Return a) k = k a
>    (>>=) (Action act) f = 
>       Action (act >>= (\ a -> case f a of {Return a -> return a;Action act -> act}))

Or, more general:

data MonadWrap m a = M (m a) | R a
instance Monad m => Monad (MonadWrap m) where
    return = R
    R x >>= f = f x
    M x >>= f = M (x >>= \a->case f a of
                                R b -> return b
                                M c -> c)

I don't think this really solves the problem with the left unit
(not in general, and not for IO either),
it merely pushes it to a different place.
I think you need the left-unit law for monad m
to prove the 'associativity' law for monad (MonadWrap m)
The 'associativity' law:
         m >>= (\x -> k x >>= h) = (m >>= k) >>= h
The case in which the situation occurs is m=(M x) with (k x)=(R b).

Stefan Kahrs


_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to