0

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

我试图思考如何使用 continuation-passing 风格来做到这一点,但是我没有想到任何有用的东西。

那有可能吗?

我认为我可以“排序”列表以使其按预测顺序排列,但看起来并不好。

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

4

1 回答 1

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)

您生成的数据类型将是(Maybe String、Maybe String、Maybe String),按“alpha”、“beta”和“gamma”的顺序排列。

于 2012-07-07T14:25:32.050 回答