I am learning Haskell, so I decided to implement everyone's favorite, overused Unix command -- cat. Below is my simple implementation, comments about style, implementation, etc. are welcomed.
In particular, is my untilEOF idiomatically ok? Is there a better way to accomplish this? Also, while talking about untilEOF, it is slightly annoying that hIsEOF returns IO Bool and that functions like 'not' only want Bool. Sure makes the logic tests feel like more work than they should be.
cat.hs: module Main where
import IO import System(getArgs)
untilEOF :: Handle -> (Handle -> IO ()) -> IO () untilEOF hdl f = do eof <- hIsEOF hdl if eof then return () else do f hdl untilEOF hdl f
cat :: Handle -> IO () cat hdl = do line <- hGetLine hdl putStrLn line
catFile :: FilePath -> IO () catFile path = do hdl <- openFile path ReadMode untilEOF hdl cat
main :: IO () main = do args <- getArgs if (length args) > 0 then mapM_ catFile args else untilEOF stdin cat
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe