[Haskell-cafe] csv one-liner

Dougal Stanton dougal at dougalstanton.net
Tue Sep 30 14:58:15 EDT 2008

2008/9/30 wman <666wman at 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) ?

I have good news for you:

either :: (b ->c) (a -> c) (Either b a) -> c

That type signature is from memory, but you get the idea. You pass in
two functions - one to deal with the Left and the other to deal with
the Right, and it sorts out your result for you.



Dougal Stanton
dougal at dougalstanton.net // http://www.dougalstanton.net

More information about the Haskell-Cafe mailing list