haskell - ¿Cómo analizar una bandera opcional como un valor de Maybe?
command-line-arguments applicative (1)
Vea el siguiente pasaje del README optparse-applicative :
Los analizadores son instancias tanto de
Applicativecomo deAlternative, y funcionan con cualquier combinador genérico, comomanyysome. Por ejemplo, para hacer que una opción devuelvaNothinglugar de fallar cuando no se suministra, puede usar el combinadoroptionalenControl.Applicative:
optional $ strOption ( long "output" <> metavar "DIRECTORY" )
En consecuencia, todo lo que tiene que hacer es aplicar el combinador optional al resultado de 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
Pruebas en la línea de comando:
$ main --in foo -o bar
Config {cIn = Just "foo", cOut = Just "bar"}
$ main -i foo
Config {cIn = Just "foo", cOut = Nothing}
Estoy tratando de usar optparse-applicative para analizar un Maybe String pero no puedo encontrar en ningún lugar cómo tratar con Maybe . Lo único que encontré es agregar un valor predeterminado, pero realmente necesito un Nothing si el usuario no proporcionó una opción en lugar de "" . ¿Hay alguna manera de lograr esto?
Aquí hay un ejemplo de código de trabajo:
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
Sin embargo, me gustaría que los parámetros fueran opcionales y usar Maybe String lugar de String en Config :
data Config = Config
{ cIn :: Maybe String
, cOut :: Maybe String
} deriving Show