鉴于你所描述的,我认为你有两个选择。在这两个,我会说,转换成字典将是最简单的,但转换成一个元组会工作,只有一点点笨拙
因此,采取这样的定义:
options :: [OptDescr (String, String)]
options = [Option ['a'] ["alpha"] (ReqArg (\a -> ("alpha", a)) "empty") "",
Option ['b'] ["beta"] (ReqArg (\a -> ("beta", a)) "empty") "",
Option ['g'] ["gamma"] (ReqArg (\a -> ("gamma", a)) "empty") ""]
main = do
args <- getArgs
let (opts, nonopts, errs) = getOpt Permute options args
putStrLn $ show opts
由此看来,一个我的示例输出的几个是:
[("beta","b"),("alpha","a")]
[("alpha","a"),("gamma","g"),("beta","b")]
等等。与命令行上的顺序相同。但是,由于我在上面设置的方式,我基本上有一个关联列表,所以...如果我特别想要一个具有值(alpha,beta,gamma)的Tuple,那么我最好的选择是......
(lookup "alpha" opts, lookup "beta" opts, lookup "gamma" opts)
您得到的数据类型将是(也许字符串,字符串也许,也许字串),在“阿尔法”,“beta”和“伽马”的顺序。
您是否考虑过使用hackage上的众多命令行解析包之一? – 2012-07-07 07:34:13
@NathanHowell我正在使用GetOpt和Permute订购 – jdevelop 2012-07-07 07:35:02
像'cmdargs'和'optparse-applicative'这样的软件包会填充记录字段。忽略命令行中参数的顺序。您可以尝试其中一种或两种方法作为GetOpt的替代方案。 – 2012-07-07 07:43:03