This is a personal mental model of how I would classify Haskell main type classes if
semigroupoidswere first-class.
Functor: <$>
- Apply:
<*>,<.>- Applicative:
pure,return - Bind:
join,=<<,<=<
- Applicative:
- Alternative (Alt):
<|>,<!>- Zero (Alternative):
zero,empty
- Zero (Alternative):
- CoApply:
<@>- CoApplicative:
copure,extract - Extend:
duplicate
- CoApplicative:
- SemiGroup:
<>- Monoid:
empty,mempty
- Monoid:
- SemiGroupoid:
>>>- Category:
id- Arrow:
arrfirst
- Arrow:
- Category:
-
Plus -> Apply + Zero:
<+>,mplus(Left Distribution) -
Or -> Applicative + Zero:
<!>,morelse(Left Catch) -
Monad -> Bind + Applicative
-
MonadPlus -> Monad + Plus
-
MonadOr -> Monad + Or
-
CoMonad -> Extend + CoApplicative