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

时间:2016-04-02 16:05:41

标签: haskell command-line-arguments optparse-generic

我使用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"

1 个答案:

答案 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