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

时间:2015-09-06 10:07:55

标签: haskell command-line-arguments applicative optparse-applicative

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

以下是工作代码的示例:

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中使用String代替Config

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

1 个答案:

答案 0 :(得分:25)

请参阅optparse-applicative README的以下段落:

  

解析器是ApplicativeAlternative的实例,并且正常工作   使用任何通用组合器,例如manysome。例如,要做   一个选项返回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}