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?

Original source