
On Tue, 2008-09-30 at 14:54 -0400, Graham Fawcett wrote:
2008/9/30 wman <666wman@gmail.com>:
I got asked how to do one particular thing in excel, which led to discssion with "our local MSOffice expert". During the discussion I stated that's it too much of a PITA and that I'd rather write a script. Long story short, I promised him a one-liner to "show the power and beauty of Haskell".
I got the csv package from hackage, modified the parseCSVFromFile so it's returns IO CSV rather than IO (Either ParseError CSV), and finished with following code
(writeFile "output.csv") =<< (liftM printCSV $ liftM (map updateLine) $ parseCSVFromFile "input.csv")
Is there room for improvement ? Could it still be made into one-liner without modifying the csv module (and without resorting to case parseCSVFromFile "input.csv" of { Left _ -> []; Right x -> x} kind of tricks) ?
How about:
parseCSVFromFile "in.csv" >>= return . either (const "error!")
Whenever you see this >>= return . f pattern think liftM or fmap or <$>.
printCSV >>= writeFile "out.csv"
(either (const "error!") printCSV <$> parseCSVFromFile "in.csv") >>= writeFile "out.csv"