According to the Haskell wikibook, a Monad
called m
is a Functor
with two additional operations:
unit :: a -> m a
join :: m (m a) -> m a
That's nice, but I have something slightly different. Glossing over the gory details, I have a type that has good unit
and join
functions, but its fmap
is not well behaved (fmap g . fmap f
is not necessarily fmap (g.f)
). Because of this, it cannot be made an instance of Monad
. Nonetheless, I'd like to give it as much generic functionality as possible.
So my question is, what category theoretic structures are similar to monads in that they have a unit
and join
?
I realize that on some level, the above question is ill-defined. For monads the unit
and join
definitions only make sense in terms of the fmap
definition. Without fmap
, you can't define any of the monad laws, so any definitions of unit
/join
would be equally "valid." So I'm looking for functions other than fmap
that it might make sense to define some "not-monad" laws on these unit
and join
functions.