使用cmdargs排序参数

时间:2015-08-29 17:21:15

标签: haskell haskell-cmdargs

我想创建一个程序,使用cmdargs获得一些参数。 我想检索文件路径列表和要执行的操作列表。我需要采取这些文件,并按顺序执行这些操作

我的论据是这样声明的:

data Options = 
    Mode1   { 
              input :: [FilePath]
            , act1 :: Bool
            , act2 :: Bool
            , act3 :: Bool
            } deriving (Data, Typeable, Show, Eq)

mode1 = 
  Mode1 { 
            input   = []      &= name "i" &= help "input file"   &= typ "FILE"
          , act1    = False   &= name "a" &= help "action 1"     &= typ "ACTION"
          , act2    = False   &= name "b" &= help "action 2"     &= typ "ACTION"
          , act3    = False   &= name "c" &= help "action 3"     &= typ "ACTION"
        }

我设法按顺序获取文件路径列表,其中包含StringFilePath)列表。通过这种方式,我可以获得订购的输入文件:

./myprog --input="file1.txt" --input="file2.txt"
./myprog --input="file2.txt" --input="file1.txt"

但是,只要声明为Bool,我就无法对其进行排序。 我想通过这样的论点:

./myprog --act1 --act2 --act3 --input="file1.txt" --input="file2.txt"
./myprog --act3 --act1        --input="file1.txt" --input="file2.txt"
./myprog --act2 --act3 --act1 --input="file1.txt" --input="file2.txt"

获取不同的输出结果。

cmdargs是否可以按顺序检索不同的参数?

1 个答案:

答案 0 :(得分:1)

  

cmdargs是否可以按顺序检索不同的参数?

是的,enum

$ runhaskell ~/testargs.hs -a -b -1 "~" -c -a
Mode1 {input = ["~"], acts = [ActA,ActB,ActC,ActA]}

使用:

{-# LANGUAGE DeriveDataTypeable #-}
import System.Console.CmdArgs

data Act = 
    ActA
  | ActB
  | ActC
  deriving (Show, Typeable,  Data, Eq)

data Options = Mode1
  { input :: [FilePath]
  , acts :: [Act]
  } deriving (Show, Data, Typeable, Eq)

actsDef :: [Act]
actsDef = (enum
  [ [] &= ignore
  , [ActA] &= name "a" &= help "action a"
  , [ActB] &= name "b" &= help "action b" 
  , [ActC] &= name "c" &= help "action c" 
  ]) &= typ "ACTION"

mode :: Options
mode = Mode1
  { input = [] &= name "1" &= help "input file" &= typ "FILE"
  , acts = actsDef 
  }

main = print =<< cmdArgs mode