# What arrows are used for in Haskell

## What is it?

An arrow `a b c`

takes input something of type `b`

and outputs `c`

It is used as a way to model computations.

Some examples of arrows:

```
-- type representing a computation
data MyArr b c = MyArr (b -> (c,MyArr b c))
instance Arrow MyArr b c where
-- Functions are arrows too
instance Arrow (->) b c where
```

To run an arrow computation:

```
-- run a function arrow
runF :: (b -> c) -> b -> c
runF = id
-- run a MyArr arrow, discarding the remaining computation
runMyArr :: MyArr b c -> b -> c
runMyArr (MyArr step) = fst . step
```

## Usecases:

Processing lists of inputs

In this case the computation model can implicitly make use of state without exposing the state to the programmer

`-- run a function arrow over multiple inputs runFList :: (b -> c) -> [b] -> [c] runFList f = map f -- run a MyArr over multiple inputs. -- Each step of the computation gives the next step to use runMyArrList :: MyArr b c -> [b] -> [c] runMyArrList _ [] = [] runMyArrList (MyArr step) (b:bs) = let (this, step') = step b in this : runMyArrList step' bs`

Combining computations:

`-- function that, given an input n, returns "n+1" and "n*2" calc1 :: Int -> (Int,Int) calc1 = (+1) &&& (*2)`

Streams:

Works well for streams probably but I donâ€™t have any examples :P