3
我想在一個程序中使用optparse-applicative庫,該程序根據參數數目執行不同的操作。optparse-applicative Backtracking
例如,參數解析爲它計算周長的程序:
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
組合器。
如何解析另類套參數任何想法,當第一種選擇可能消耗下一個選擇的一些參數?
看着runParser的實現表明它不能回溯,但我不是100%確定的。你可以使用命令子分析器重新設計你的程序參數嗎? – 2014-09-22 03:15:06
感謝您的想法。它可以用於形狀周長計算程序。但在我的實際應用中,單獨的命令子分析器不適合。 – rvl 2014-09-29 02:01:58