Georg Martius writes:
Hi folks,
I would like to use Arrows, but I just can't figure out how to actually use them. I looked at various documentations including the API doc [1], the Wiki [2], [3], and some random pages on the net but didn't find a single simple example that tells me how to apply an Arrow to a value.
It depends on the type of the arrow. Arrows of type (->) can be applied directly, because they're just plain functions. Arrows of type 'Kleisli m' can be applied using a simple 'runKleisli' function. runKleisli :: Kleisli m a b -> a -> m b runKleisli (Kleisli f) = f (I'm not sure why this isn't in Control.Arrow in the first place.) Using your example arrow, we can use ($) and 'runKleisli' to coerce it into functions of various types. myAdd1A :: (Arrow a, Num b) => a b b myAdd1A = arr (\x -> x + 1) ($) myAdd1A :: Num b => b -> b runKleisli myAdd1A :: (Monad m, Num b) => b -> m b More interesting arrows, like the signal processors in Yampa [4], may not have a meaningful concept of application. [4] <http://www.haskell.org/yampa/> -- David Menendez <zednenem@psualum.com> <http://www.eyrie.org/~zednenem/>