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組合器。

如何解析另類套參數任何想法,當第一種選擇可能消耗下一個選擇的一些參數?

+0

看着runParser的實現表明它不能回溯,但我不是100%確定的。你可以使用命令子分析器重新設計你的程序參數嗎? – 2014-09-22 03:15:06

+0

感謝您的想法。它可以用於形狀周長計算程序。但在我的實際應用中,單獨的命令子分析器不適合。 – rvl 2014-09-29 02:01:58

回答

2

請注意:這個答案寫在optparse,合用的作者,保羅Capriotti。

不能直接optparse,應用性做到這一點。 optparse-applicative的主要功能 是可以按任意順序解析選項。如果 你想主要與參數(這是位置)工作,你有 更好有兩個級別的分析器:使用many argument在 optparse-applicative,然後將結果數組傳遞給一個正常的分析器 (說使用Parsec)。如果你只位置參數,然後 optparse,應用性也不會買你非常多,你可以隻手動 參數解析用秒差距。