What are the differences between arrow and monads
Observe that arrow makes explicit the dependency on the input
-- Here b is the input and dependency of the computation
Arrow a b c
On the other hand monads do not have these (only the output)
Monad m a
We can observe similarities to:
Applicative f => f (a -> b)
Monad m => a -> m b
Since we have access to the input, we can modify the control flow itself:
class Category y => Arrow y where
-- Minimal implementation: arr and first
arr :: (a -> b) -> y a b -- converts function to arrow
-- These functions modify the computation flow
first :: y a b -> y (a, c) (b, c) -- maps over first component
second :: y a b -> y (c, a) (c, b) -- maps over second component
(***) :: y a c -> y b d -> y (a, b) (c, d) -- first and second combined
(&&&) :: y a b -> y a c -> y a (b, c) -- (***) on a duplicated value
Recommended reading: