27

我正在尝试使用optparse-applicative解析 aMaybe 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

但是,我希望参数是可选的并使用Maybe String而不是Stringin Config

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

1 回答 1

35

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

Applicative解析器是and的实例Alternative,并且可以与任何通用组合器一起使用,例如manyand some。例如,要使选项Nothing在未提供时返回而不是失败,您可以在 中使用optional组合器Control.Applicative

optional $ strOption
   ( long "output"
  <> metavar "DIRECTORY" )

因此,您所要做的就是将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

命令行测试:

$ main --in foo -o bar
Config {cIn = Just "foo", cOut = Just "bar"}
$ main -i foo
Config {cIn = Just "foo", cOut = Nothing}
于 2015-09-06T10:57:55.160 回答