Let's find our way towards arrows from the perspective of monads. Consider the following IO code:
import System.IO main = do main = liftM (length . words) (readFile "jabberwocky.txt" ) >>= print -- regular functions: length, words -- Monadic functions: readFile, print
We use liftM
to lift the composed function length . words
into the monadic function readFile
and then feed the result to another monadic function, print
.
We can compose the regular functions with (.)
, but we know well that we cannot do the following:
print . length . words . readFile "jabberwocky.txt" -- INVALID - types don't align
Let's make the preceding code possible!
Note
The following code is based on a combination of Programming with Arrows by John Hughes, and a blog post by John Wiegley at http://www.newartisans.com/2012/10/arrows-are-simpler-than-they-appear/.
The crux of our approach will be to create a "meta type" to represent monadic IO functions and then define composition...