
Am Mittwoch, 21. Januar 2009 23:03 schrieb Tony Morris:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
In the code below, the Applicative instance accumulates on the Left constructor using Monoid/mappend. Is it possible to write an equivalent Monad such that ap = (<*>) ? I'm finding difficulty in proving to myself either way.
import Control.Monad.Instances import Control.Applicative import Data.Monoid
newtype Z e a = Z { either :: Either e a }
instance Functor (Z e) where fmap f (Z e) = Z (f `fmap` e)
instance (Monoid e) => Applicative (Z e) where pure = Z . Right (Z (Left e1)) <*> (Z (Left e2)) = Z (Left (e1 `mappend` e2)) (Z (Left e1)) <*> (Z (Right _)) = Z (Left e1) (Z (Right _)) <*> (Z (Left e2)) = Z (Left e2) (Z (Right f)) <*> (Z (Right a)) = Z (Right (f a))
instance (Monoid e) => Monad (Z e) where return = pure (Z e) >>= f = error "todo" -- ?
I think Z (Left e) >>= f = Z (Left e) Z (Right a) >>= f = f a would be the only choice.