Я пытаюсь использовать библиотеку 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)
Только первый аргумент <|>
будет успешно проанализирован. Я думаю, что требуется какой-то возврат аргумента, подобный комбинатору Parsec try
.
Любые идеи о том, как анализировать альтернативные наборы аргументов, когда первая альтернатива может использовать некоторые аргументы следующей альтернативы?