Pointfree/Combine

From HaskellWiki

A program to number lines of a file, just for fun, using the 'combine' function found with @pl in #haskell.

import Control.Monad
import Text.Printf
import System.Environment

combine :: (Monad m) => m a -> (a -> b -> c) -> m b -> m c
combine a f b = (b >>=) . (return .) . f =<< a

main = do [f] <- getArgs
          ls  <- combine (return [(1::Int)..])
                         (zipWith (printf "%4d %s"))
                         (lines `fmap` readFile f)
          mapM_ putStrLn ls

When run:

$ runhaskell A.hs A.hs
   1 import Control.Monad
   2 import Text.Printf
   3 import System.Environment
   4
   5 combine :: (Monad m) => m a -> (a -> b -> c) -> m b -> m c
   6 combine a f b = (b >>=) . (return .) . f =<< a
   7
   8 main = do [f] <- getArgs
   9           ls  <- combine (return [(1::Int)..])
  10                          (zipWith (printf "%4d %s"))
  11                          (lines `fmap` readFile f)
  12           mapM_ putStrLn ls