<div dir="ltr">On Tue, Mar 21, 2017 at 3:53 AM, Louis Pan <span dir="ltr"><<a href="mailto:louis@pan.me" target="_blank">louis@pan.me</a>></span> wrote:<br><div class="gmail_quote"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div style="font-size:12.8px">Hi all,</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">In my Glazier GUI library, I had to use newtype wrappers to create Semigroup and Monoid instances for ReaderT.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Is there a reason why ReaderT doesn't have an instance of Semigroup and Monoid?</div></div></blockquote><div><br></div></span><div>There are at least three reasonable instances of Semigroup and Monoid for ReaderT.</div><span class=""><div><br></div><div>instance (Applicative m, Monoid a) => Monoid (ReaderT r m a) where</div><div>    mempty = pure mempty</div></span><div>    mappend a b = mappend <$> a <*> b</div><div><br></div><div>instance (Alternative m) => Monoid (ReaderT r m a) where</div><div>    mempty = empty</div><div>    mappend = (<|>)</div><div><br></div><div>instance (Monoid (m a)) => Monoid (ReaderT r m a) where</div><div>    mempty = ReaderT $ mempty</div><div>    mappend a b = ReaderT $ mappend a b</div></div><div><br></div><div><br></div><div>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.</div><span class="HOEnZb"><font color="#888888"><div><br></div></font></span></div></div></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Dave Menendez <<a href="mailto:dave@zednenem.com" target="_blank">dave@zednenem.com</a>><br><<a href="http://www.eyrie.org/~zednenem/" target="_blank">http://www.eyrie.org/~zednenem/</a>></div>
</div>