Overlapping instances by turning Monads into Semigroups
haskell
Solution
The common way in which these problems are solved is with a newtype wrapper. You wouldn't define an `instance Semigroup (m a)`, but rather
newtype WrappedMonad m a = WrappedMonad { getWrappedMonad :: m a }
instance Monad m => Semigroup (WrappedMonad m a) where
WrappedMonad a <> WrappedMonad b = WrappedMonad (a >> b)
Problem
`Monads` define `Semigroups` via ``` instance Monad m => Semigroup (m a) where (<>) = (>>) ``` using FlexibleInstances. If I wanted to make `Maybe a` into a `Semigroup` in that way I would run into an Intance overlap, because `Data.Semigroup` defines an ``` instance Semigroup a => Semigroup (Maybe a) ``` What is the Haskell-Way to resolve something like that?