Overlapping instances by turning Monads into semigroups

Monads define Semigroups via

 instance Monad m => Semigroup (ma) where (<>) = (>>) 

using FlexibleInstances.

If I wanted to make Maybe a in Semigroup this way, I would run Intance in the overlap, because Data.Semigroup defines

 instance Semigroup a => Semigroup (Maybe a) 

What is a Haskell way to resolve something like this?

+6
source share
1 answer

A common way to solve these problems is with the newtype wrapper. You would not define instance Semigroup (ma) , but rather

 newtype WrappedMonad ma = WrappedMonad { getWrappedMonad :: ma } instance Monad m => Semigroup (WrappedMonad ma) where WrappedMonad a <> WrappedMonad b = WrappedMonad (a >> b) 
+11
source

All Articles