Ответ 1
См. следующий отрывок optparse-applicative
README:
Парсеры являются экземплярами как
Applicative
, так иAlternative
, и работают с любым общим комбинатором, напримерmany
иsome
. Например, чтобы сделать опция returnNothing
вместо сбоя, когда она не предоставляется, вы может использовать комбинатор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}