我想创建一个程序,使用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"
}
我设法按顺序获取文件路径列表,其中包含String
(FilePath
)列表。通过这种方式,我可以获得订购的输入文件:
./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是否可以按顺序检索不同的参数?
答案 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