Difference between revisions of "Checking for correct invocation of a command line haskell program"
Jump to navigation
Jump to search
m (Minor formatting changes) |
|||
(11 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | [[Category:How to]] |
||
− | Running our example: |
||
+ | This page shows checking for correct invocation of a command line / shell haskell program. The first example is a version which gives a "user friendly" error message when invoked incorrectly, the second is an example of "ugly" argument checking that is slightly simpler to write, but gives a less user friendly error message |
||
+ | ==Usage examples== |
||
+ | |||
+ | <tt><pre> |
||
+ | runghc arghandling-nice.hs 0 1 2 |
||
+ | "0 1 2" |
||
+ | runghc arghandling-ugly.hs 0 1 2 |
||
− | thartman@linodehaskell:~/learning/haskell/UnixTools/arghandling>./args.sh |
||
+ | "0 1 2" |
||
− | Checking for correct invocation of a command line / shell haskell program |
||
− | We run a nice example, |
||
+ | runghc arghandling-nice.hs 0 1 |
||
− | alongside example of "ugly" argument checking that is simpler to write, |
||
+ | *** Exception: args length does not equal 3. args: : ["0","1"] |
||
− | but gives a less user friendly error message when the program is invoked incorrectly |
||
+ | usage example: $ runghc arghandling-nice.hs firstarg secondarg thirdarg |
||
+ | runghc arghandling-ugly.hs 0 1 |
||
+ | *** Exception: user error (Pattern match failure in do expression at arghandling-ugly.hs:3:10-29) |
||
+ | </pre></tt> |
||
+ | ==The code== |
||
− | ********** |
||
− | nice arg handling, no errors: |
||
− | "0 1 2" |
||
+ | * <tt>arghandling-nice.hs</tt>: |
||
+ | :<haskell> |
||
+ | import System |
||
+ | main = do args <- getArgs |
||
− | ugly arg handling, no errors: |
||
+ | let usagemsg = "usage example: $ runghc arghandling-nice.hs firstarg secondarg thirdarg" |
||
− | "0 1 2" |
||
+ | case args of |
||
+ | [first,second,third] -> process first second third |
||
+ | _ -> error $ "args length does not equal 3. args: : " ++ ( show args ) ++ "\n" ++ usagemsg |
||
+ | process a b c = print $ unwords [a,b,c] |
||
+ | </haskell> |
||
+ | * <tt>arghandling-ugly.hs</tt>: |
||
− | nice arg handling, errors: |
||
+ | :<haskell> |
||
− | *** Exception: args length does not equal 3. args: : ["0","1"] |
||
+ | import System |
||
− | usage example: $ runghc arghandling-nice.hs firstarg secondarg thirdarg |
||
+ | main = do [first,second,third] <- getArgs |
||
+ | process first second third |
||
+ | process a b c = print $ unwords [a,b,c] |
||
− | ugly arg handling, errors: |
||
+ | </haskell> |
||
− | *** Exception: user error (Pattern match failure in do expression at arghandling-ugly.hs:3:10-29) |
||
+ | ==See also:== |
||
− | Source code... |
||
+ | * [[Simple unix tools]] |
||
− | args.sh: |
||
+ | * [[Error reporting strategies]] |
||
− | |||
+ | * [http://leiffrenzel.de/papers/commandline-options-in-haskell.html Command line options in haskell] |
||
− | |||
+ | * [http://groups.google.de/group/fa.haskell/browse_thread/thread/6359767a8e64bc5d/e5286a2783c22bbe?lnk=st&q=haskell+string+fill+ins&rnum=1&hl=en#e5286a2783c22bbe string fill-ins (discussion at haskell cafe)] |
||
− | thartman@linodehaskell:~/learning/haskell/UnixTools/arghandling>cat args.sh |
||
− | cat <<EOF |
||
− | Checking for correct invocation of a command line / shell haskell program |
||
− | |||
− | We run a nice example, |
||
− | |||
− | alongside example of "ugly" argument checking that is simpler to write, |
||
− | but gives a less user friendly error message when the program is invoked incorrectly |
||
− | |||
− | |||
− | ********** |
||
− | EOF |
||
− | |||
− | echo nice arg handling, no errors: |
||
− | runghc arghandling-nice.hs 0 1 2 |
||
− | echo |
||
− | echo |
||
− | |||
− | echo ugly arg handling, no errors: |
||
− | runghc arghandling-ugly.hs 0 1 2 |
||
− | echo |
||
− | echo |
||
− | |||
− | |||
− | echo nice arg handling, errors: |
||
− | runghc arghandling-nice.hs 0 1 |
||
− | echo |
||
− | echo |
||
− | |||
− | echo ugly arg handling, errors: |
||
− | runghc arghandling-ugly.hs 0 1 |
||
− | |||
− | |||
− | |||
− | thartman@linodehaskell:~/learning/haskell/UnixTools/arghandling>cat arghandling-nice.hs |
||
− | import System |
||
− | |||
− | main = do args <- getArgs |
||
− | let usagemsg = "usage example: $ runghc arghandling-nice.hs firstarg secondarg thirdarg" |
||
− | case args of |
||
− | [first,second,third] -> process first second third |
||
− | _ -> error $ "args length does not equal 3. args: : " ++ ( show args ) ++ "\n" ++ usagemsg |
||
− | |||
− | process a b c = print $ unwords [a,b,c] |
||
− | |||
− | |||
− | |||
− | thartman@linodehaskell:~/learning/haskell/UnixTools/arghandling>cat arghandling-ugly.hs |
||
− | import System |
||
− | |||
− | main = do [first,second,third] <- getArgs |
||
− | process first second third |
||
− | |||
− | process a b c = print $ unwords [a,b,c] |
Latest revision as of 02:29, 9 April 2021
This page shows checking for correct invocation of a command line / shell haskell program. The first example is a version which gives a "user friendly" error message when invoked incorrectly, the second is an example of "ugly" argument checking that is slightly simpler to write, but gives a less user friendly error message
Usage examples
runghc arghandling-nice.hs 0 1 2 "0 1 2" runghc arghandling-ugly.hs 0 1 2 "0 1 2" runghc arghandling-nice.hs 0 1 *** Exception: args length does not equal 3. args: : ["0","1"] usage example: $ runghc arghandling-nice.hs firstarg secondarg thirdarg runghc arghandling-ugly.hs 0 1 *** Exception: user error (Pattern match failure in do expression at arghandling-ugly.hs:3:10-29)
The code
- arghandling-nice.hs:
import System main = do args <- getArgs let usagemsg = "usage example: $ runghc arghandling-nice.hs firstarg secondarg thirdarg" case args of [first,second,third] -> process first second third _ -> error $ "args length does not equal 3. args: : " ++ ( show args ) ++ "\n" ++ usagemsg process a b c = print $ unwords [a,b,c]
- arghandling-ugly.hs:
import System main = do [first,second,third] <- getArgs process first second third process a b c = print $ unwords [a,b,c]