What arrows are used for in Haskell
What is it?
a b c takes input something of type
b and outputs
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
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
-- function that, given an input n, returns "n+1" and "n*2" calc1 :: Int -> (Int,Int) calc1 = (+1) &&& (*2)
Works well for streams probably but I don’t have any examples :P