【发布时间】:2016-10-10 21:09:12
【问题描述】:
如果我有以下类型和解析器:
data Mode =
Mode1
| Mode2
deriving (Show, Eq, Read)
data ThingINeedMulitpleOf =
Thing { _name :: String, _mode :: Mode }
deriving (Show, Eq)
thingParser :: Parser ThingINeedMulitpleOf
thingParser = Thing <$> strArgument (metavar "NAME")
<*> option auto (long "mode" <> metavar "MODE")
我通过以下方式构建解析器:
data Config =
Config ThingINeedMulitpleOf ThingINeedMulitpleOf
deriving (Show, Eq)
loadConfig = execParser $ info (Config <$> thingParser <*> thingParser) fullDesc
然后我可以成功解析my-exe Thing1 --mode Mode1 Thing2 --mode Mode2,但这仅在我想要两个Things 时才有用。
我在尝试更改 Config 以支持 n Things 时遇到问题,即:
data Config =
Config [ThingINeedMulitpleOf]
deriving (Show, Eq)
loadConfig = execParser $ info (Config <$> many thingParser) fullDesc
但我现在无法解析 my-exe Thing1 --mode Mode1 Thing2 --mode Mode2,给我错误 Invalid argument 'Thing1'
有趣的是,如果 ThingINeedMulitpleOf 仅包含一个字段,则此方法有效。
【问题讨论】:
标签: parsing haskell applicative command-line-arguments