将列表转换为元组

时间:2012-07-07 07:27:09

标签: list haskell tuples continuation-passing

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

我试着用延续传递方式思考如何做到这一点,但是没有任何有用的东西进入我的脑海。

这有可能吗?

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

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

1 个答案:

答案 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”。