[Haskell-cafe] Fwd: Semigroup and Monoid instances for ReaderT

David Menendez dave at zednenem.com
Wed Mar 22 19:55:06 UTC 2017


On Tue, Mar 21, 2017 at 3:53 AM, Louis Pan <louis at pan.me> wrote:

> Hi all,
>
> In my Glazier GUI library, I had to use newtype wrappers to create
> Semigroup and Monoid instances for ReaderT.
>
> Is there a reason why ReaderT doesn't have an instance of Semigroup and
> Monoid?
>

There are at least three reasonable instances of Semigroup and Monoid for
ReaderT.

instance (Applicative m, Monoid a) => Monoid (ReaderT r m a) where
    mempty = pure mempty
    mappend a b = mappend <$> a <*> b

instance (Alternative m) => Monoid (ReaderT r m a) where
    mempty = empty
    mappend = (<|>)

instance (Monoid (m a)) => Monoid (ReaderT r m a) where
    mempty = ReaderT $ mempty
    mappend a b = ReaderT $ mappend a b


In the absence of a principled reason to prefer one over the others and a
general consensus, I think it’s better not to choose.

-- 
Dave Menendez <dave at zednenem.com>
<http://www.eyrie.org/~zednenem/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20170322/0ed59433/attachment.html>


More information about the Haskell-Cafe mailing list