我尝试使用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
答案 0 :(得分:25)
请参阅optparse-applicative
README的以下段落:
解析器是
Applicative
和Alternative
的实例,并且正常工作 使用任何通用组合器,例如many
和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}