
On Wed, 2009-01-14 at 12:45 -0800, Sukit Tretriluxana wrote:
Hi all,
I was looking around Stroustrup's website and found a simple program that he showed how standard library can be used to make the program succinct and safe. See http://www.research.att.com/~bs/bs_faq2.html#simple-program. I wondered how a Haskell program equivalent to it looks like and I came up with the code below.
import qualified Control.Exception as E
main = E.catch (interact reverseDouble) (\_ -> print "format error")
reverseDouble = unlines . doIt . words where doIt = intro . toStrings . reverse . toDoubles . input toDoubles = map (read::String->Double) toStrings = map show input = takeWhile (/= "end") intro l = ("read " ++ (show $ length l) ++ " elements") : "elements in reversed order" :
My only criticism is that I find code written with lots of secondary definitions like this confusing; so I would inline most of the definitions: reverseDouble = unlines . intro . map show . reverse . map (read :: String -> Double) . takeWhile (/= "end") . words where intro l = ("read " ++ show (length l) ++ " elements") : "elements in reversed order" : l I observe also in passing that the cast on read is somewhat inelegant; in a real application, the consumer of map read's output would specify its type sufficiently that the cast would be un-necessary. For example, the program could be specified to compute sines instead: main = E.catch (interact unlines . intro . map (show . sin . read) . words) $ \ _ -> print "format error" where intro l = ("read " ++ show (length l) ++ " arguments") : "computed sins" : l (Others will no doubt object to the use of lazy I/O. I disagree in principle with those objections.) jcc PS Stroustrup's comments about vectors are at best half right; push_back may extend the vector's length correctly, but operator[] on a vector certainly does not do bounds checking.