Pregunta

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.

¿Fue útil?

Solución

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top