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.
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe