12

我試圖用optparse-applicative解析Maybe String,但我找不到任何地方如何處理Maybe。我唯一發現的是添加默認值,但如果用戶沒有提供選項而不是"",我真的需要一個Nothing。有什麼辦法可以做到這一點?如何解析可能與optparse應用

下面是工作的代碼的示例:

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代替StringConfig

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

我不太瞭解'optparse-applicative',但[本頁](https://hackage.haskell.org/package/optparse-applicative-0.11.0.2)建議應用'optional' combinator在'strOption'之上應該做你想做的事情。 – Jubobs

+0

我沒有看到頁面底部有一個額外的文檔。這是行得通的。你可以發佈它作爲答案,我會接受它。 – mb14

回答

16

參見以下通道optparse-applicative README

解析器在使用任何通用組合器,例如manysome,都可以使用ApplicativeAlternative以及使用 。例如,爲了使 一個選項回報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}