我正在尝试使用optparse-applicative来解析一个Maybe String
但我找不到任何地方如何处理Maybe
.我发现的唯一的事情是添加一个默认值,但我真的需要一个Nothing
if用户没有提供选项而不是""
.有没有办法实现这个目标?
以下是工作代码的示例:
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
而不是String
在Config
:
data Config = Config
{ cIn …
Run Code Online (Sandbox Code Playgroud) haskell command-line-arguments applicative 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
我希望有一个全局选项,可以与所有子命令中提供--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 …
我正在构建一个脑残编译器。可执行文件接受两个命令$ 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) 我正在尝试在程序中使用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
有示例: 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
是否可以使用optparse-applicative中的方法创建一个haskell表达式来解析这样的程序选项?
program [-a [-b]] ...
Run Code Online (Sandbox Code Playgroud)
-a和-b是选项标志(使用实现switch
),约束条件是-b选项仅在以前键入-a时有效.
谢谢
我发现我精心设计的解析器无法解析我抛出的任何字符串:
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 新手。作为一项学习练习,我正在尝试将我的一个 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) 我正在使用 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
如何从以下方面为此示例实现解析器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
.
我有使用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)
问题与使用许多组合器有关,因为一旦我删除它,代码运行正常.
这是一个错误还是我做错了什么?
谢谢!