あなたの質問は、あなたが考えるよりも複雑であることが判明しました。現時点ではoptparse-applicative
APIはこのようなケースでは使用されていません。したがって、おそらく、CLIの引数を扱う方法を変更したり、別のCLI解析ライブラリに切り替えることができます。しかし、私はあなたの目標を達成する最も近い方法を説明します。あなたがoptional
機能を使用して、オプションの引数を解析する方法を知っている
1.How to parse Maybe with optparse-applicative
2.Is it possible to have a optparse-applicative option with several parameters?
最初の質問者:
まず、あなたは、他の2つのSOの質問を読んでする必要があります。秒から、複数の引数を解析する際のいくつかの問題を学びます。この問題を回避するには、いくつかのアプローチをここに書きます。
1.ナイーブと醜い
あなたはString
タイプのペアとして文字列のペアを表し、このペアのちょうどナイーブshow
を使用することができます。 ghci
に
ここ
mainParser :: Parser Arguments
mainParser = Arguments
<$> switch (long "someflag" <> help "Some argument flag")
<*> optional (uncurry SubArguments <$>
(option auto $ long "subarguments" <> help "some desc"))
getArguments :: IO Arguments
getArguments = do
(res,()) <- simpleOptions "main example" "" "desc" mainParser empty
return res
main :: IO()
main = getArguments >>= print
結果である:ここでは、コードです
ghci> :run main --someflag --subarguments "(\"a\",\"b\")"
Arguments True (Just (SubArguments "a" "b"))
2.あまりあなたが1つの文字列内で複数の引数を渡す方法を学ぶ必要がある2番目の質問への答えから
ナイーブ。ここでは、解析のためのコードは次のとおりです。
subArgParser :: ReadM SubArguments
subArgParser = do
input <- str
-- no error checking, don't actually do this
let [a,b] = words input
pure $ SubArguments a b
mainParser :: Parser Arguments
mainParser = Arguments
<$> switch (long "someflag" <> help "Some argument flag")
<*> optional (option subArgParser $ long "subarguments" <> help "some desc")
そして、ここではghci
出力されます。
ghci> :run main --someflag --subarguments "x yyy"
Arguments True (Just (SubArguments "x" "yyy"))
第二の溶液中唯一の悪い点は、エラーチェックが存在しないということです。したがって、let [a,b] = words input
ではなく、別の汎用構文解析ライブラリ、たとえばmegaparsec
を使用することができます。
私は図書館の著者に尋ねました。それは不可能です(今のところ)。パオロ・カピリオッティによるアンヴェールを見る – Pieter