[Haskell-cafe] generalizing the writer monad
Strake
strake888 at gmail.com
Thu Oct 18 05:10:43 CEST 2012
On 17/10/2012, Petr P <petr.mvd at gmail.com> wrote:
> Hi,
>
> (this is a literate Haskell post.)
>
> lately I was playing with the Writer monad and it seems to me that it
> is too tightly coupled with monoids. Currently, MonadWriter makes the
> following assumptions:
>
> (1) The written value can be read again later.
> (2) For that to be possible it has to be monoid so that multiple (or
> zero) values can be combined.
>
> I fell say that this is a bit restricting. Sometimes, the written
> value can be lost - either used to compute something else or for
> example sent out using some IO action to a file, network etc. For
> example, I'd like to create an IO-based writer monad whose `tell` logs
> its argument somewhere - prints it, stores to a file etc.
No need:
newtype SequenceM m a = SequenceM (m a);
instance (Monad m, Monoid a) => Monoid (SequenceM m a) where {
mempty = SequenceM (return mempty);
SequenceM mx `mappend` SequenceM my = SequenceM (liftM2 mappend mx my);
}
whatever :: (MonadWriter (SequenceM IO ()) m) => m ();
whatever = tell (SequenceM (someIO :: IO ()));
Cheers,
Strake
More information about the Haskell-Cafe
mailing list