我使用optparse-generic来解析名为example
的程序的命令行参数。我有一个带有命名字段的数据类型(记录语法)。例如:
data Example = Example { foo :: Int, bar :: String } deriving (Generic, Show)
这会生成一个程序,可以按如下方式调用:
./example --foo 42 --bar "baz"
我如何告诉optparse-generic bar
应该是一个未命名的,强制的位置命令行参数。这意味着,当我致电--bar
时,我不想输入example
。例如,我想打电话给example
以下内容:
./example --foo 42 "baz"
答案 0 :(得分:2)
optparse-generic
不支持从单个数据类型定义生成这样的解析器,因为Haskell不支持带有标记和未标记字段的记录。
但是,您可以做的是为所有标记字段生成一种数据类型,为未标记字段生成一种类型,然后使用Applicative
操作将它们组合起来,如下所示:
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