gpt4 book ai didi

haskell - 如何使用 optparse-applicative 创建嵌套/条件选项?

转载 作者:行者123 更新时间:2023-12-04 23:00:51 26 4
gpt4 key购买 nike

可以使用optparse-applicative 中的方法创建一个haskell 表达式。 ,像这样解析程序选项?

program [-a [-b]] ...

-a -b 是可选标志(使用 switch 实现),具有 的约束-b 选项仅在 时有效-a 是之前输入的。

谢谢

最佳答案

这是可能的,只需稍作调整,有两种不同的方式:

  • 您可以制作一个只允许 -b 的解析器如果你有 -a , 但你不能坚持 -a首先,因为 optparse-applicative 的 <*>组合器没有指定顺序。
  • 你可以坚持 -b选项跟在 a 之后选项,但您可以通过实现 a 来实现作为一个命令,所以你失去了 -在它面前。

  • Applicative 绝对足够强大,因为不需要检查解析器返回的值来确定 -b是允许的,所以 >>=没有必要;如果 -a任何输出都成功, -b被允许。

    例子

    我将使用数据类型来表示存在哪些参数,但实际上这些会更有意义。
    import Options.Applicative

    data A = A (Maybe B) deriving Show
    data B = B deriving Show

    所以我们程序的选项可能包含一个 A,它可能有一个 B,并且总是有一个字符串。
    boption :: Parser (Maybe B)
    boption = flag Nothing (Just B) (short 'b')

    方式 1:标准组合器 - -b只能带 -a (任何顺序)

    我将使用 flag' () (short 'a')这只是坚持 -a在那里,但然后使用 *>而不是 <*>忽略返回值 ()并返回 boption 中的任何内容解析器返回,给出选项 -a [-b] .然后我会用 A :: Maybe B -> A 标记它最后我会做整个事情 optional , 所以你有选项 [-a [-b]]
    aoption :: Parser (Maybe A)
    aoption = optional $ A <$> (flag' () (short 'a' ) *> boption)

    main = execParser (info (helper <*> aoption)
    (fullDesc <> progDesc "-b is only valid with -a"))
    >>= print

    请注意,由于 <*>允许任何订单,我们可以输入 -a-b 之后(这不是您所要求的,但可以正常工作并且对某些应用程序有意义)。
    ghci> :main -a 
    Just (A Nothing)
    ghci> :main -a -b
    Just (A (Just B))
    ghci> :main -b -a
    Just (A (Just B))
    ghci> :main -b
    Usage: <interactive> [-a] [-b]
    -b is only valid with -a
    *** Exception: ExitFailure 1

    方式二:命令子解析器 - -b只能关注 a
    您可以使用 command制作 subparser这仅在存在命令字符串时有效。您可以使用它来处理像 cabal 一样的参数,以便 cabal installcabal update有完全不同的选择。由于 command需要 ParserInfo参数,任何你可以给 execParser 的解析器可以使用,因此您实际上可以任意深度嵌套命令。遗憾的是,命令不能以 - 开头,所以它将是 program [a [-b]] ...而不是 program [-a [-b]] ... .
    acommand :: Parser A
    acommand = subparser $ command "a" (info (A <$> (helper <*> boption))
    (progDesc "you can '-b' if you like with 'a'"))

    main = execParser (info (helper <*> optional acommand) fullDesc) >>= print

    像这样运行:
    ghci> :main 
    Nothing
    ghci> :main a
    Just (A Nothing)
    ghci> :main a -b
    Just (A (Just B))
    ghci> :main -b a
    Usage: <interactive> [COMMAND]
    *** Exception: ExitFailure 1

    所以你必须先于 -ba .

    关于haskell - 如何使用 optparse-applicative 创建嵌套/条件选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25223983/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com