12

Maybe Stringを解析するためにoptparse-applicativeを使用しようとしていますが、Maybeの処理方法はわかりません。私が見つけた唯一の事はデフォルト値を追加することですが、ユーザーが""の代わりにオプションを指定しなかった場合、実際にはNothingが必要です。これを達成する方法はありますか?ここでoptparse-applicativeと解析する方法

は動作するコードの例です:

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 

しかし、私は、パラメータが任意でかつConfigに代わりStringMaybe Stringを使用したい:

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)では、'オプションの 'コンビネータ'strOption'の上にあなたが望むことをする必要があります。 – Jubobs

+0

ページの下部に追加の文書がありませんでした。これは機能しています。あなたはそれを回答として掲示して、それを受け入れることができますか? – mb14

答えて

16

は、の次の一節を参照してください。 optparse-applicative README

パーサーは姿勢がApplicativeAlternativeであり、 とmanysomeのような一般的な結合子を使用してください。例えば、それは与えていないとき オプションのリターンNothing代わりのが失敗にするために、あなた はControl.Applicativeoptionalコンビネータを使用することができます。

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}