
xj2106:
Hi,
I'm wondering how usually you parse command line arguments list safely. If the given argument is wrong, the program can still print out some error information instead of giving something like
Prelude.read: no parse
Let's make the discussion concrete. Suppose we have the following code.
-->8----------8<-- import System.Environment
data Conf = Conf { number :: Int }
parseArgs [] = error "need at least one argument" parseArgs (x:_) = Conf { number = read x }
work (Conf { number = n }) = n * (n-1) `div` 2
main = print . work . parseArgs =<< getArgs -->8----------8<--
If the "read x" fails in line 8, the program dies with
Prelude.read: no parse
What is the standard way to make the error message useful?
Xiao-Yong --
The main thing is to define a safe read. This will be in the base library soon, maybeRead :: Read a => String -> Maybe a maybeRead s = case reads s of [(x, "")] -> Just x _ -> Nothing Then you can pattern match on the failure case as Nothing. Cheers, Don