ReadArgs provides the readArgs
IO action, which lets you tell the compiler
to parse the command line arguments to fit the type signature you give.
For example (a :: Int, b :: String, c :: Float) <- readArgs
would
parse the first runtime argument as an Int
, the second as a String
(no
quotes required) and the third as a Float
.
If the runtime arguments are incompatible with the type signature,
then a simple usage statement is given of the types needed.
Continuing the previous example, if it was used in a
program named Example
, the error message for the above
action would be:
usage: Example Int String Float
Any type that has both Typeable
and Read
instances
can be used. Char
, String
, and Text
are handled specially so that
command line arguments for both do not require quotes (as their
Read
instances do). A special instance is provided for FilePath
so
that no constructor or quotes are required.
readArgs
also supports optional arguments and variadic arguments.
Optional arguments are specified using Maybe
, and variadic arguments
using a list. (a :: Int, b :: Maybe String, c :: [Float]) <- readArgs
would successfully parse any of the following sets of command line arguments:
Example 1
Example 1 2 3 4
Example 1 foo
Example 1 foo 2 3 4
But not
Example
Example foo
Example 1.0
Usage statements for optional and variadic arguments use command-line
parlance:
usage: Example Int [String] [Float..]
Note that both optional and variadic parsers are greedy by default
(so Example 1 2 3 4
was parsed as (1, "2", [3.0,4.0])
. They
may both be made non-greedy through use of the NonGreedy
constructor:
( a :: Int
, NonGreedy b :: NonGreedy Maybe String
, NonGreedy c :: NonGreedy [] Float
) <- readArgs