标签: optparse-applicative

如何将可选标志解析为Maybe值?

我正在尝试使用optparse-applicative来解析一个Maybe String但我找不到任何地方如何处理Maybe.我发现的唯一的事情是添加一个默认值,但我真的需要一个Nothingif用户没有提供选项而不是"".有没有办法实现这个目标?

以下是工作代码的示例:

import Options.Applicative

data Config = Config
    { cIn :: String
    , cOut :: String
    } deriving Show

configParser :: Parser Config
configParser = Config
    <$> strOption (long "in" <> short 'i')
    <*> strOption (long "out" <> short 'o')


main :: IO ()
main = do
    conf <- execParser (info configParser fullDesc)
    print conf
Run Code Online (Sandbox Code Playgroud)

但是,我希望参数是可选的,Maybe String而不是StringConfig:

data Config = Config
    { cIn …
Run Code Online (Sandbox Code Playgroud)

haskell command-line-arguments applicative optparse-applicative

22
推荐指数
1
解决办法
1842
查看次数

如何在optparse-applicative生成的帮助消息中指定缺失命令的名称?

我正在尝试使用Hackage的optparse-applicative包,并且在如何指定在指定的命令不足的情况下运行程序时显示的帮助消息的某个方面时有一个问题.

以下示例程序说明了我的问题.从命令行运行时,它将两个命令之一作为输入.也就是说,它可以作为$ program com1或运行$ program com2.

module Main where

import Options.Applicative
import Data.Semigroup ((<>))

data Command = Com1
             | Com2

com1 :: Parser Command
com1 = subparser $ command "com1" $ info (pure Com1) fullDesc

com2 :: Parser Command
com2 = subparser $ command "com2" $ info (pure Com2) fullDesc

commandParser :: Parser Command
commandParser = com1
            <|> com2

runCommand :: Command -> IO ()
runCommand Com1 = putStrLn ">>> Com1 <<<"
runCommand Com2 …
Run Code Online (Sandbox Code Playgroud)

haskell optparse-applicative

7
推荐指数
1
解决办法
73
查看次数

如何使用'optparse-applicative'创建和区分全局选项?

在我使用的Haskell可执行文件中,optparse-applicative我希望有一个全局选项,可以与所有子命令中提供--version的全局--help选项一起使用.但是,提供示例(见下文)用于向--version具有子命令的CLI 添加选项会导致--version选项不一致

$ cli create --version
Invalid option `--version'

Usage: cli create NAME
  Create a thing

$ cli delete --version
0.0
Run Code Online (Sandbox Code Playgroud)

并且永远不会出现在子命令的帮助中

$ cli create -h
Usage: cli create NAME
  Create a thing

Available options:
  NAME                     Name of the thing to create
  -h,--help                Show this help text

$ cli delete -h
Usage: cli delete 
  Delete the thing

Available options:
  -h,--help                Show this help text
Run Code Online (Sandbox Code Playgroud)

我想要的行为是--version …

haskell command-line-interface optparse-applicative

7
推荐指数
1
解决办法
205
查看次数

optparse-applicative bash 自动补全是如何工作的?

我正在构建一个脑残编译器。可执行文件接受两个命令$ brainfuck compile ...$ brainfuck run。我希望可执行文件在按 Tab 时自动完成。例如,写入$ brainfuck com然后按 Tab 应该生成$ brainfuck compile.

data Command = Compile CompileArgs | Run RunArgs
  deriving (Show)

main :: IO ()
main = execute =<< execParser opts
  where
    opts = info (helper <*> argsParser) fullDesc

execute :: Command -> IO ()
execute (Compile args)  = compile args
execute (Run args)      = run args

argsParser :: Parser Command
argsParser = subparser (compileCommand <> runCommand)
  where
    compileCommand …
Run Code Online (Sandbox Code Playgroud)

haskell optparse-applicative

6
推荐指数
1
解决办法
348
查看次数

optparse-应用回溯

我正在尝试在程序中使用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)
Run Code Online (Sandbox Code Playgroud)

只有第一个参数<|>才能成功解析。我认为需要某种参数回溯,类似于秒差距的try组合器。

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

haskell command-line-arguments applicative optparse-applicative

5
推荐指数
1
解决办法
353
查看次数

optparse-applicative:如何处理 Arrow 语法中的无参数情况

有示例: https: //github.com/pcapriotti/optparse-applicative/blob/master/tests/Examples/Cabal.hs#L46-L62

parser :: Parser Args
parser = runA $ proc () -> do
  opts <- asA commonOpts -< ()
  cmds <- (asA . hsubparser)
            ( command "install"
              (info installParser
                    (progDesc "Installs a list of packages"))
           <> command "update"
              (info updateParser
                    (progDesc "Updates list of known packages"))
           <> command "configure"
              (info configureParser
                    (progDesc "Prepare to build the package"))
           <> command "build"
              (info buildParser
                    (progDesc "Make this package ready for installation")) ) -< ()
  A version >>> A helper -< …
Run Code Online (Sandbox Code Playgroud)

haskell arrows command-line-arguments applicative optparse-applicative

5
推荐指数
1
解决办法
518
查看次数

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

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

program [-a [-b]] ...
Run Code Online (Sandbox Code Playgroud)

-a-b是选项标志(使用实现switch),约束条件是-b选项仅在以前键入-a时有效.

谢谢

haskell applicative optparse-applicative

4
推荐指数
1
解决办法
876
查看次数

是否可以使用带有多个参数的optparse-applicative选项?

我发现我精心设计的解析器无法解析我抛出的任何字符串:

roi :: Parser (Maybe ROI)
roi = optional $ option (ROI <$> auto <*> auto <*> auto <*> auto)
               $ long "roi" <> metavar "ROI" <> help "Only process selected region of interest"
Run Code Online (Sandbox Code Playgroud)

哪里 ROI = ROI Int Int Int Int

如果这很重要,它将嵌套在更高的解析器中

options :: Parser Opts
options = Opts <$> input <*> output <*> roi <*> startT <*> endT  
Run Code Online (Sandbox Code Playgroud)

哪里Opts是适当的ADT.

现在我假设roi解析器将解析表达式,--roi 1 2 3 4但它失败Invalid argument '128'并给我使用消息.

--roi 1 而是解析但返回 Just …

haskell optparse-applicative

4
推荐指数
2
解决办法
645
查看次数

如何在 Options.Applicative 中为互斥标志编码

我是 Haskell 新手。作为一项学习练习,我正在尝试将我的一个 Rust 程序移植到 Haskell。在 Rust 中,我使用了令人惊叹的clap包,并且被认为是Options.Applicative一个好看的替代品。下面是一个例子:

import Options.Applicative
import Data.Semigroup ((<>))

data Sample = Sample
  { tod        :: Bool
  , pmc        :: Bool
  , tai        :: Bool
  }

sample :: Parser Sample
sample = Sample
      <$>  switch
          ( long "tod"
            <> short 'o'
            <> help "Convert from TOD" )
      <*> switch
          ( long "pmc"
            <> short 'p'
            <> help "Convert from PMC" ) 
      <*> switch
          ( long "tai"
            <> short 't'
            <> help "Set …
Run Code Online (Sandbox Code Playgroud)

haskell optparse-applicative

3
推荐指数
1
解决办法
180
查看次数

optparse-applicative 子命令帮助文本

我正在使用 stackage lts 5.1 附带的 optparse-applicative 我有一个带有子命令的解析器,并且我已经描述了它们的选项的帮助文本,但它们没有显示。

这是我运行可执行文件时的输出--help

[david@devcentos65 manipro]$ /home/david/.local/bin/manipro --help
manipro - text1

Usage: manipro COMMAND [-v|--verbose]   text2

Available options:  
  -h,--help                Show this help text  
  -v,--verbose             text3

Available commands:   
  export                   text4
  dico                     text9
Run Code Online (Sandbox Code Playgroud)

代码 :

parserArgs :: ParserInfo ArgApp
parserArgs = info (helper <*> args) desc
    where
    desc =  
        fullDesc <> 
        progDesc "text1"  <> 
        header "text2"


args = ArgApp <$> argCmd <*> optverbose
    where
    optverbose = switch ( 
        short 'v' <> long "verbose" <> 
        help "text3" …
Run Code Online (Sandbox Code Playgroud)

haskell command-line-arguments applicative optparse-applicative

2
推荐指数
1
解决办法
1040
查看次数

使用optparse-applicative解析"枚举"选项

如何从以下方面为此示例实现解析器grep --help:

 --binary-files=TYPE   assume that binary files are TYPE;
                       TYPE is 'binary', 'text', or 'without-match'
Run Code Online (Sandbox Code Playgroud)

假设我有

data BinaryFiles = Binary | Text | WithoutMatch
Run Code Online (Sandbox Code Playgroud)

我该如何编写解析器?option auto似乎是一个kludge,因为Read它应该是一个"逆" Show,我想保持派生instance Show BinaryFiles.

haskell optparse-applicative

2
推荐指数
1
解决办法
227
查看次数

如何在Haskell的optparse-applicative中使用具有多个值的选项

我有使用optparse-applicative的以下Haskell代码,它在运行时挂起.

main :: IO ()
main = do
  printf "Start...\n"
  args <- execParser $ info args fullDesc
  printf "Cmdline args: %s\n" (show args)

args :: Parser [Integer]
args = many (option auto
         (short 'x'
           <> value 1))
Run Code Online (Sandbox Code Playgroud)

问题与使用许多组合器有关,因为一旦我删除它,代码运行正常.

这是一个错误还是我做错了什么?

谢谢!

haskell optparse-applicative

1
推荐指数
1
解决办法
140
查看次数