# 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: