2012-07-07 238 views
0

我有几个命令行选项(例如5),我想将它们转换为元组。问题是我期望它们以正确的顺序出现,所以元组可以使用模式匹配从列表中轻松构建,但在现实生活中,可以随机顺序提供选项,所以我不知道列表的头部是否包含详细选项或日志文件名称?将列表转换为元组

我试着想如何使用延续传递风格来做到这一点,然而没有任何有用的东西进入我的脑海。

这有可能吗?

我认为我可以对列表进行“排序”,使其按照预测的顺序排列,但看起来不太好。

另外我可以摆脱元组并创建数据记录 - 但是这仍然会导致检查属性的类型并设置记录的正确字段。还有很多打字。

+0

您是否考虑过使用hackage上的众多命令行解析包之一? – 2012-07-07 07:34:13

+0

@NathanHowell我正在使用GetOpt和Permute订购 – jdevelop 2012-07-07 07:35:02

+1

像'cmdargs'和'optparse-applicative'这样的软件包会填充记录字段。忽略命令行中参数的顺序。您可以尝试其中一种或两种方法作为GetOpt的替代方案。 – 2012-07-07 07:43:03

回答

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)的Tuple,那么我最好的选择是......

(lookup "alpha" opts, lookup "beta" opts, lookup "gamma" opts) 

您得到的数据类型将是(也许字符串,字符串也许,也许字串),在“阿尔法”,“beta”和“伽马”的顺序。