`Arrow`

is just another typeclass that is used to composite computation. A computation takes inputs of some type and produces outputs of another type. In haskell, a funciton is a computation:`f :: b -> c`

The minimal complete Arrow typeclass definition includes three functions and a set of laws.

```
class Arrow a where
-- A function is a computation
arr :: (b -> c) -> a b c
-- Composite computations by feeding output of one computation to input of another
(>>>) :: a b c -> a c d -> a b d
-- Apply computation on first part of inputs, with the rest parts untouched.
first :: a b c -> a (b, d) (c, d)
```

Here are some examples to help you get some intuition.

```
import Control.Arrow
import Data.Char
-- show
f = arr even $ 42
g = arr ord >>> arr even $ '*'
h = (first $ arr even) (42, 42)
-- /show
main = do
putStrLn $ "f = " ++ (show f)
putStrLn $ "g = " ++ (show g)
putStrLn $ "h = " ++ (show h)
```