我有几个命令行选项(例如5个),我想将它们转换为元组。问题是我希望它们以正确的顺序出现,因此可以使用模式匹配从列表中轻松构建元组,但在现实生活中,可以按随机顺序提供选项,因此我不知道列表的头部是否包含详细选项或日志文件名?
我试着用延续传递方式思考如何做到这一点,但是没有任何有用的东西进入我的脑海。
这有可能吗?
我认为我可以“排序”列表以按预测顺序排列,但看起来并不好。
此外,我可以摆脱元组并创建数据记录 - 但是仍然会导致检查属性的类型并设置记录的正确字段。还有很多打字。
答案 0 :(得分:1)
鉴于你的描述,我认为你有两种选择。在这两个中,我会说转换成字典会是最简单的,但转换为元组会起作用,只会有点笨拙
所以,采用这个定义:
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)的元组,那么我最好的选择是......
(lookup "alpha" opts, lookup "beta" opts, lookup "gamma" opts)
您得到的数据类型将是(可能是String,Maybe String,Maybe String),顺序为“alpha”,“beta”和“gamma”。