optparse-applicative:至少需要一个参数

Lam*_*iry 7 haskell command-line-arguments

我在一个应用程序中使用optparse-applicative库,该应用程序在命令行上接受多个字符串并对每个字符串执行操作.我的第一次尝试是这样的:

arguments Just
    ( metavar "EXPR"
    & help "Expressions to render, in zero-based De Bruijn index notation" )
Run Code Online (Sandbox Code Playgroud)

不幸的是,这允许在没有参数的情况下运行程序,即使它没有多大意义.

我的第二次尝试涉及分别解析第一个参数,然后将其转移到列表的其余部分:

(:) <$> argument Just ( metavar "EXPR" )
    <*> arguments Just ( metavar "EXPR" )
Run Code Online (Sandbox Code Playgroud)

这应该有效,但它没有:当调用时--help,解析器吞噬它并处理它而不是显示帮助文本.

所以我的问题是:如何配置optparse以至少需要一个参数?

Lam*_*iry 6

好的 - 我已经图书馆的作者(Paolo Capriotti)报告了这个问题.他回答:

这里的问题是arguments有一些特殊的逻辑:

  • 最初忽略以' - '开头的参数
  • 接受' - '
  • 在遇到' - '之后接受以' - '开头的参数

鉴于这种期望的行为,arguments不能简单地实现为many argument.

我们可以做些什么来使像这个问题更容易处理的常见用例,是添加一堆便利构建器,如:

  • arguments1,非空参数列表,与参数具有相同的行为
  • argument',解析1个参数,忽略以' - '开头的东西

这样,许多参数'将类似于参数(没有 - 的特殊处理),以及参数1的一些参数.

欢迎提出更好名字的建议.:)

换句话说,他添加了一个新功能arguments1来完成我所描述的内容.该功能自0.5版开始提供.

所以现在我的代码看起来像这样:

arguments1 Just
    ( metavar "EXPR"
   <> help "Expressions to render, in zero-based De Bruijn index notation" )
Run Code Online (Sandbox Code Playgroud)

谢谢,保罗!