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?
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With