【问题标题】:converting list to tuple将列表转换为元组
【发布时间】:2012-07-07 07:27:08
【问题描述】:

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

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

这有可能吗?

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

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

【问题讨论】:

  • 您是否考虑过在 hackage 上使用众多命令行解析包之一?
  • @NathanHowell 我正在使用 GetOpt 和 Permute 排序
  • cmdargsoptparse-applicative 等包填写记录字段.. 忽略命令行参数的顺序。您可以尝试其中一种或两种方法来替代 GetOpt。
  • @jdevelop GetOpt 出了什么问题?我之前已经多次使用它,并在这样的用例中取得了巨大的成功。
  • @DanielWagner GetOpt 没有任何问题,它会在命令行中找到选项时返回选项。但我需要将选项列表转换为元组。也许元组不是一个好的选择。

标签: list haskell tuples continuation-passing


【解决方案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”的顺序排列。

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 2016-09-28
    • 1970-01-01
    • 2018-07-20
    • 2012-06-05
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多