Если у меня есть следующие типы и анализатор:Haskell optparse-аппликативны: разбор списка записей, которые имеют несколько полей
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
для поддержки пThing
с, то есть:
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
содержит только одно поле.