Difference between revisions of "Checking for correct invocation of a command line haskell program"

From HaskellWiki
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]

See also: