[Haskell-cafe] Seeking help to generalize this ..

Juan Casanova juan.casanova at ed.ac.uk
Sat Feb 1 22:11:53 UTC 2020

> Related:
> In Data.Monoid there is the 'Endo' newtype, which wraps functions of
> type 'a -> a'. Is there an 'EndoM' variant, or is that something that's
> usually created by putting other pieces together? Below is a sketch of
> what I mean:
> -- Maybe this is known by another name?
> newtype EndoM f a = EndoM { appEndoM :: a -> f a }
> -- Bind typeclass is from package semigroupoids.
> -- It means "Monad sans 'return'".
> -- Maybe use Monad f => here instead if getting the Bind instances is
> -- too annoying? (e.g., Writing orphan instances).
> instance Bind f => Semigroup (EndoM f a) where
>   EndoM f <> EndoM g = EndoM $ f ->- g
> -- Bind is not a superclass of Monad, so we get this awkward set of
> -- required constraints here.
> instance (Bind f, Monad f) => Monoid (EndoM f a) where
>   mempty = EndoM pure
> -- Jack

Not undervaluing this post, but to be clear to the OP, all of that  
really isn't adding any capabilities, just reifying the ones that  
others exposed. (You can use foldMap instead of foldr). This could be  
useful if you want to do higher-level stuff with it later on, but for  
the purposes of the original post I think it really is overkill, isn't  

The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.

More information about the Haskell-Cafe mailing list