optparse-应用性选项我使用optparse-applicative
和我想能够解析命令行参数如:具有多个值
$ ./program -a file1 file2 -b filea fileb
即两个开关,这两者都可以采取多个参数。
所以,我有我的选择数据类型,看起来像这样:
data MyOptions = MyOptions {
aFiles :: [String]
, bFiles :: [String] }
然后一个Parser
这样的:
config :: Parser MyOptions
config = MyOptions
<$> option (str >>= parseStringList)
(short 'a' <> long "aFiles")
<*> option (str >>= parseStringList)
(short 'b' <> long "bFiles")
parseStringList :: Monad m => String -> m [String]
parseStringList = return . words
这种方法失败的,因为它会产生预期的结果当每个开关只提供一个参数时,但如果提供第二个参数,则会为第二个参数获得“无效参数”。我想知道是否可以假装我想要四个选项来组装它:布尔开关(即-a
);字符串列表;另一个布尔开关(即-b
);和另一个字符串列表。所以我改变了我的数据类型:
data MyOptions = MyOptions {
isA :: Bool
, aFiles :: [String]
, isB :: Bool
, bFiles :: [String] }
,然后进行修改这样的解析器:使用many
和argument
组合算符,而不是一个字符串列表中的一个明确的解析器
config :: Parser MyOptions
config = MyOptions
<$> switch
(short 'a' <> long "aFiles")
<*> many (argument str (metavar "FILE"))
<*> switch
(short 'b' <> long "bFiles")
<*> many (argument str (metavar "FILE"))
这一次。
但是现在第一个many (argument str (metavar "FILE"))
消耗全部的参数,包括那些在-b
开关之后的参数。
那么我怎么写这个参数解析器?
但是,如果'-a'的参数被限制为不以'-'开头,那么自由参数不会含糊不清。 – rampion