
I think that there's no solution for your problem as stated, besides
going with something like type-indexed monads, which leads you down
the no-implicit-prelude path.
But to see one obvious reason why this is the case: can you tell me
what the type of "returnAF" is?
Also, one of the monad laws is
m >>= return = m
I don't see how this can possibly be the case with the definition of
bindAF you have given.
-- ryan
On Tue, Dec 23, 2008 at 5:50 PM, Jeremy Shaw
Hello,
I want to make a Monad which is almost exactly like the Writer monad, except instead of using mappend to glue Monoids together, it uses <*> to glue applicative functors together.
Here is the code:
import Control.Applicative import Data.Monoid
-- * Sample Implementation of the Writer Monad
data Writer w a = Writer { runWriter :: (w, a) }
instance (Monoid w) => Monad (Writer w) where return a = Writer (mempty, a) (>>=) = bindWriter
bindWriter :: (Monoid w) => Writer w a -> (a -> Writer w b) -> Writer w b bindWriter (Writer (w,a)) f = let (Writer (w', b)) = f a in Writer (w `mappend` w', b)
-- * Sample Implementation of the Applicative Functor Monad
data AF af a = AF { runAF :: (af, a) }
bindAF :: (Applicative f) => AF (f (a -> b)) x -> (x -> AF (f a) y) -> AF (f b) y bindAF (AF (f, x)) g = let (AF (a, y)) = g x in AF (f <*> a, y)
-- instance (Applicative f) => Monad (AF (f ...
As you can see, the similarity is striking. Alas, AF and bindAF do not quite have the right type signatures to be used for an instance of the Monad class. Is there some clever work-around I missing? (Aside from, -fno-implicit-prelude).
Thanks!
- jeremy _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe