我试图在程序中使用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
组合器。当第一个备选方案可能消耗下一个备选方案的某些参数时,关于如何解析备选参数集的任何想法?
最佳答案
请注意:此答案是由适用于optparse的作者Paolo Capriotti撰写的。
您不能直接使用optparse-applicative进行此操作。主要特点
optparse-applicative的优点是可以按任何顺序解析选项。如果
您想主要使用参数(位置参数),
最好具有两个级别的解析器:在中使用many argument
optparse-applicative,然后将结果数组传递给普通解析器
(例如使用Parsec)。如果只有位置参数,则
optparse-applicative不会给您带来很多好处,您可以解析
使用Parsec手动设置参数。