【问题标题】:optparse-applicative Backtrackingoptparse-applicative 回溯
【发布时间】:2014-09-21 06:42:23
【问题描述】:

我正在尝试在程序中使用 optparse-applicative 库,该程序应根据参数的数量执行不同的操作。

例如,计算周长的程序的参数解析:

module TestOpts where

import Options.Applicative

type Length = Double

data PerimeterCommand
    = GeneralQuadranglePerimeter Length Length Length Length
    | RectanglePerimeter Length Length

parsePerimeterCommand :: Parser PerimeterCommand
parsePerimeterCommand = parseQuadPerimeter <|> parseRectPerimeter

parseQuadPerimeter = GeneralQuadranglePerimeter <$>
                     parseLength "SIDE1" <*>
                     parseLength "SIDE2" <*>
                     parseLength "SIDE3" <*>
                     parseLength "SIDE4"

parseRectPerimeter = RectanglePerimeter <$>
                     parseLength "WIDTH" <*> parseLength "HEIGHT"

parseLength name = argument auto (metavar name)

只有&lt;|&gt; 的第一个参数才能成功解析。我认为需要某种参数回溯,类似于 Parsec 的 try 组合器。

关于如何解析替代参数集的任何想法,当第一个替代方案可能会消耗下一个替代方案的一些参数时?

【问题讨论】:

  • 查看 runParser 的实现表明它不能回溯,但我不是 100% 确定。你能用命令子解析器重新设计你的程序参数吗?
  • 感谢您的想法。它可以用于形状周长计算程序。但在我的实际应用程序中,单独的命令子解析器不适合。

标签: haskell command-line-arguments applicative optparse-applicative


【解决方案1】:

请注意:此答案由 optparse-applicative 作者 Paolo Capriotti 撰写。

您不能直接使用 optparse-applicative 执行此操作。主要特点 optparse-applicative 的特点是可以按任何顺序解析选项。如果 你想主要使用参数(它们是位置的),你是 最好有两个级别的解析器:使用many argument in optparse-applicative,然后将结果数组传递给普通解析器 (比如说使用 Parsec)。如果你只有有位置参数,那么 optparse-applicative 不会给你买太多,你可以解析 使用 Parsec 手动设置参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多