Reputation: 6366
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.
Upvotes: 9
Views: 776
Reputation: 53665
Well here's one law you should have with just unit
and join
. Given x :: m a
,
join (unit x) = x
To show that this didn't just come from nowhere, let's start with an existing monad law:
return x >>= f = f x
Given that m >>= f = join (fmap f m)
join (fmap f (return x)) = f x
Select f = id
join (fmap id (return x)) = id x
Use the functor law that fmap id = id
join (id (return x)) = id x
Use the obvious id a = a
join (return x) = x
Upvotes: 3