2016-04-02 10 views
3

Ich verwende optparse-generic, um die Befehlszeilenargumente eines Programms namens example zu analysieren. Ich habe einen Datentyp mit benannten Feldern (Record-Syntax). Zum Beispiel:Haskell, unbenannte Befehlszeilenargumente für optparse-generic

data Example = Example { foo :: Int, bar :: String } deriving (Generic, Show) 

Dies erzeugt ein Programm, das wie folgt aufgerufen werden kann:

./example --foo 42 --bar "baz" 

Wie kann ich optparse-generic sagen, dass bar sollte eine unbenannte, obligatorisch, Positionsbefehlszeilenargument sein. Das heißt, ich möchte --bar nicht eingeben, wenn ich example aufrufen. Zum Beispiel möchte ich example folgendes nennen:

./example --foo 42 "baz" 
+2

Ich glaube nicht, Wir brauchen ein [tag: optparse-generic] -Tag. Was stimmt nicht mit [tag: Befehlszeilenparsing]? –

Antwort

1

optparse-generic unterstützt einen solchen Parser aus einer einzigen Datentyp-Definition Erzeugung nicht da Haskell Datensätze nicht unterstützt mit beiden markierten und unmarkierten Felder aus.

jedoch, was Sie tun können, ist für alle markierten Felder und ein Typ für die nicht markierten Felder einen Datentyp erzeugen und kombinieren sie dann Applicative Operationen verwendet wird, wie folgt aus:

data Labeled = Labeled { foo :: Int } deriving (Generic, Show) 

instance ParseRecord Labeled 

data Unlabeled = Unlabeled String deriving (Generic, Show) 

instance ParseRecord Unlabeled 

data Mixed = Mixed Labeled Unlabeled deriving (Show) 

instance ParseRecord Mixed where 
    parseRecord = Mixed <$> parseRecord <*> parseRecord 
+0

Dies scheint den Hilfetext mehrmals zu drucken, wenn Sie mit '--help' arbeiten. Ich bin mir nicht sicher, wie ich das angehen soll ... –