2016-07-11 4 views
1

は、オプションのための私のレコードタイプは次のようである: レコードタイプのために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"を使用した場合のみ印刷します。コマンドラインでオプションが指定されていないときには印刷したいと思います。

答えて

1

String[Char]のためだけの型シノニムですので、あなたはhead要素_(何でも)とテールリスト_(何でも)と、パターン_:_と非空の文字列に、すなわちA非空のリストを一致させることができます。

  • Options {xml = _:_, eut = []}

    だからあなたは3例かもしれないxmlが設定されているが、eut
  • Options {xml = [], eut = _:_}未設定:設定されているeutxml
  • _設定されていない:すべての残りの部分(どちらかでもありませんセット、またはその両方)

また、g o:multi-way if

Options{..} <- execParser ... 
if | not (null xml) && null eot -> ... 
    | not (null eot) && null xml -> ... 
    | otherwise -> error ... 
関連する問題