Haskell,optparse-generic的未命名命令行参数

3

我正在使用optparse-generic来解析一个名为example的程序的命令行参数。我有一个带有命名字段(记录语法)的数据类型。例如:

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

这将生成一个可以按以下方式调用的程序:
./example --foo 42 --bar "baz"

我该如何告诉optparse-generic,bar应该是一个无名的、必需的、位置相关的命令行参数。这意味着,在调用example时,我不想输入--bar。例如,我想以以下方式调用example:
./example --foo 42 "baz"

2
我认为我们不需要一个 [tag:optparse-generic] 标签。 [tag:command-line-parsing] 有什么问题吗? - Artjom B.
1个回答

3

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

2
当你使用 --help 运行时,似乎会多次打印帮助文本。不确定如何解决这个问题... - Lyndon Maydwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接