<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 style="font-size:12.8px"><br></div><div style="font-size:12.8px">The reader ((->) a) is a Monoid and a Semigroup.</div><div style="font-size:12.8px"><a href="https://hackage.haskell.org/package/base-4.9.1.0/docs/src/GHC.Base.html#line-268" target="_blank">https://hackage.haskell.org/<wbr>package/base-4.9.1.0/docs/src/<wbr>GHC.Base.html#line-268</a><br></div><div style="font-size:12.8px"><a href="https://hackage.haskell.org/package/base-4.9.1.0/docs/src/Data.Semigroup.html#line-150" target="_blank">https://hackage.haskell.org/<wbr>package/base-4.9.1.0/docs/src/<wbr>Data.Semigroup.html#line-150</a><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Could the following be added to the transformers package? Or is it not lawful?</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">instance (Applicative m, Semigroup a) => Semigroup (ReaderT r m a) where</div><div style="font-size:12.8px">    f <> g = (<>) <$> f <*> g</div><div style="font-size:12.8px">    {-# INLINABLE (<>) #-}</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">instance (Applicative m, Monoid a) => Monoid (ReaderT r m a) where</div><div style="font-size:12.8px">    mempty = pure mempty</div><div style="font-size:12.8px">    {-# INLINABLE mempty #-}</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">    f `mappend` g = mappend <$> f <*> g</div><div style="font-size:12.8px">    {-# INLINABLE mappend #-}</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Does it make sense to extend the monoid instance to all the other transformers? Eg.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>instance (Monad m, Semigroup a) => Semigroup (StateT s m a) where</div><div>    f <> g = (<>) <$> f <*> g</div><div>    {-# INLINABLE (<>) #-}</div><div><br></div><div>instance (Monad m, Monoid a) => Monoid (StateT s m a) where</div><div>    mempty = pure mempty</div><div>    {-# INLINABLE mempty #-}</div><div><br></div><div>    f `mappend` g = mappend <$> f <*> g</div><div>    {-# INLINABLE mappend #-}</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>instance (Monad m, Monoid w, Semigroup a) => Semigroup (WriterT w m a) where<br></div><div>    f <> g = (<>) <$> f <*> g</div><div>    {-# INLINABLE (<>) #-}</div><div><br></div><div>instance (Monad m, Monoid w, Monoid a) => Monoid (WriterT w m a) where</div><div>    mempty = pure mempty</div><div>    {-# INLINABLE mempty #-}</div><div><br></div><div>    f `mappend` g = mappend <$> f <*> g</div><div>    {-# INLINABLE mappend #-}</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">and also for MaybeT, IdentityT, ExceptT, etc</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Regards,</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Louis</div></div>