我试图在程序中使用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手动设置参数。

10-04 21:19