RSS

CmdArgsの実験

HaskellのコマンドラインパーザのCmdArgsをテストしてみる。さて、テストと言ってもなにをやるのかと思ったのでPythonのargparseのサンプルを移植するということにしてみた。

15.4. argparse — Parser for command-line options, arguments and sub-commands — Python v2.7.2 documentation

このプログラムは引数として一つ以上の数字を受け取り--sum フラグがあれば合計を、なければ最大値を返す。次のような具合。

~/src/python$ python argssum.py 
usage: argssum.py [-h] [--sum] N [N ...]
argssum.py: error: too few arguments
~/src/python$ python argssum.py  3 4 1 2
4
~/src/python$ python argssum.py  3 4 1 2 --sum
10

さてこれをHaskellのCmdArgsを使って書き直すと…。

{-# LANGUAGE DeriveDataTypeable #-}

import System.Console.CmdArgs

data Sample = Sample {
  sum::Bool,
  numargs::[Int]
  } deriving (Show, Data, Typeable)

sample = Sample
               {
                 Main.sum= def &= help "true=sum, false=max",
                 numargs = def &= args &= typ "NUMS"
               } &= summary "Sum or Max v1"

main =  do 
  arguments <- cmdArgs sample 
  print ((if (Main.sum arguments) then
           Prelude.sum
         else
           maximum) (Main.numargs arguments))
           

このようなプログラムとなり実行すると

~/src/haskell$ runghc args.hs 
args.hs: Prelude.maximum: empty list
~/src/haskell$ runghc args.hs  3 4 1 2
4
~/src/haskell$ runghc args.hs  3 4 1 2 --sum
10

となる。