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

mb1*_*b14 22 haskell command-line-arguments applicative optparse-applicative

我正在尝试使用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 :: Maybe String
    , cOut :: Maybe String
    } deriving Show
Run Code Online (Sandbox Code Playgroud)

jub*_*0bs 28

请参阅optparse-applicative自述文件的以下段落:

解析器都是实例ApplicativeAlternative,并与任何普通组合子的工作,比如manysome.例如,要使选项返回Nothing而不是在未提供时失败,可以optionalControl.Applicative以下位置使用组合器:

optional $ strOption
   ( long "output"
  <> metavar "DIRECTORY" )
Run Code Online (Sandbox Code Playgroud)

因此,您所要做的就是将optional组合子应用于以下结果strOption:

import Options.Applicative

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

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

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

在命令行进行测试:

$ main --in foo -o bar
Config {cIn = Just "foo", cOut = Just "bar"}
$ main -i foo
Config {cIn = Just "foo", cOut = Nothing}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!出于某种原因,这个例子已经从 README 中删除了,所以这个答案是学习如何做这个非常基本的事情的唯一方法。 (2认同)