引数の数に応じて異なるアクションを実行するプログラムでoptparse-applicativeライブラリを使用しようとしています。
たとえば、周長を計算するプログラムの引数解析:
module TestOpts where
import Options.Applicative
type Length = Double
data PerimeterCommand
= GeneralQuadranglePerimeter Length Length Length Length
| RectanglePerimeter Length Length
parsePerimeterCommand :: Parser PerimeterCommand
parsePerimeterCommand = parseQuadPerimeter <|> parseRectPerimeter
parseQuadPerimeter = GeneralQuadranglePerimeter <$>
parseLength "SIDE1" <*>
parseLength "SIDE2" <*>
parseLength "SIDE3" <*>
parseLength "SIDE4"
parseRectPerimeter = RectanglePerimeter <$>
parseLength "WIDTH" <*> parseLength "HEIGHT"
parseLength name = argument auto (metavar name)
の最初の引数のみが<|>
正常に解析されます。try
Parsec のコンビネータと同様に、ある種の引数バックトラッキングが必要だと思います。
最初の選択肢が次の選択肢のいくつかの引数を消費する可能性がある場合、引数の代替セットを解析する方法に関するアイデアはありますか?