は、オプションのための私のレコードタイプは次のようである: レコードタイプのためにhaskell options.applicativeでパターンマッチを行う方法は?私はHaskellのコマンドラインを処理するために<code>Options.Applicative</code>を使用
data Options = Options { xml :: String
,eut :: String
} deriving (Show)
options :: Parser Options
options = Options
<$> strOption (short 'x'
<> long "xml"
<> metavar "XMLFILE"
<> value []
<> help "GCCXML file for parsing")
<*> strOption (short 'e'
<> long "eut"
<> metavar "PATH_2_EUT"
<> value []
<> help "EUT Json filepath for parsing")
はその後、私のHaskellのメインコードでは、私が持っている:
main :: IO()
main = do
options <- execParser parseOpts
case options of
Options {xml = [], eut = []} -> putStrLn "use -h to print usage info"
-- xml option
Options {xml = _, eut = []} -> parseXML $ xml options
-- eut option
Options {xml = [], eut = _} -> genMeta $ eut options
-- no matching
_ -> putStrLn "use -h to print usage info"
where
parseOpts = info (helper <*> options)
(fullDesc
<> progDesc "Given GCCXML file, generate EUT json and test meta files"
<> header "map2meta - Generate test meta files")
私の意図は、いずれかの処理を行うことです"-x"
または"-e"
である。コマンドラインに"-x"
があり、"-e"
がない場合と一致するようにパターンOptions {xml = _, eut = []}
を使用してこれを達成します。Options {xml = [], eut = _ }
は、コマンドラインに"-e"
があり、"-x"
でない場合と一致します。しかし、オプションを指定せずにプログラムを実行すると、Options {xml = _ , eut = [] }
が一致するようです。そこで、私はを追加してそのケースを傍受しました。プレースホルダ '_'は実際には '[]'にマッチさせることができますが、空の文字列ではなく「何か」にマッチすることを期待しました。したがって、私の最初の質問は、空でない文字列に一致するパターンを作成する方法です。
私の2番目の質問は、使用情報を印刷するコードを追加する方法です。今は、"-h"
を使用した場合のみ印刷します。コマンドラインでオプションが指定されていないときには印刷したいと思います。