news

Arrows provide a generalization for monads, which was introduced by John Hughes. The arrows package provides classes that extend the Arrows class. It is now available in Fedora. Install it using:

$ sudo yum install ghc-arrows-devel

Consider the identity function defined using the arrows notation:

{-# LANGUAGE Arrows #-}
 
import Control.Arrow (returnA)
 
idA :: a -> a
idA = proc a -> returnA -< a

The idA function returns the given input as shown below:

*Main> idA 6
6
*Main> idA True
True
*Main> idA "Eureka!"
"Eureka!"

A mulTwo function that multiplies an integer by two can be written as:

{-# LANGUAGE Arrows #-}
 
import Control.Arrow (returnA)

mulTwo :: Int -> Int
mulTwo = proc a -> returnA -< (a * 2)

Testing mulTwo with ghci:

*Main> mulTwo 4
8
*Main> mulTwo 5
10

We can also use the do notation with arrows. For example:

{-# LANGUAGE Arrows #-}
 
import Control.Arrow (returnA)

mulFour :: Int -> Int
mulFour = proc a -> do b <- mulTwo -< a
                       mulTwo -< b

Loading mulFour in ghci:

*Main> mulFour 2
8
*Main> mulFour 3
12

Arrows also supports the use of conditional statements. An example when used with the if … then … else construct is as follows:

{-# LANGUAGE Arrows #-}
 
import Control.Arrow (returnA)

condMul :: Int -> Int
condMul = proc a ->
               if a < 5
               then returnA -< (a * 2)
               else returnA -< (a * 3)                      

The condMul function multiplies the input integer by two if it is less than five, and with three when greater than five:

*Main> condMul 2
4
*Main> condMul 6
18