haskell command-line-arguments applicative optparse-applicative

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 Applicative como de Alternative , y funcionan con cualquier combinador genérico, como many y some . Por ejemplo, para hacer que una opción devuelva Nothing lugar de fallar cuando no se suministra, puede usar el combinador optional en Control.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