4

引数の数に応じて異なるアクションを実行するプログラムで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)

の最初の引数のみが<|>正常に解析されます。tryParsec のコンビネータと同様に、ある種の引数バックトラッキングが必要だと思います。

最初の選択肢が次の選択肢のいくつかの引数を消費する可能性がある場合、引数の代替セットを解析する方法に関するアイデアはありますか?

4

1 に答える 1

2

注: この回答は、optparse-applicative の作成者である Paolo Capriotti によって書かれました。

これを optparse-applicative で直接行うことはできません。optparse-applicative の主な機能は、オプションを任意の順序で解析できることです。主に引数 (位置指定) を操作したい場合は、2 レベルのパーサーを使用することをお勧めします: many argumentoptparse-applicative で使用し、結果の配列を通常のパーサー (たとえば、Parsec を使用) に渡します。位置引数しかない場合、optparse-applicative はあまり役に立ちません。Parsec を使用して手動で引数を解析することもできます。

于 2015-08-12T04:09:42.293 に答える