Отказ от ответственности: у меня нет опыта применения продвинутых приемов optparse-аппликативности, поэтому я могу упустить что-то очевидное. Читатели: укажите на это, если это так.
Ваша проблема в том, что many
(в описании, описанном вручную) применяет синтаксический анализатор к каждому фрагменту ввода, причем фрагменты в этом случае состоят из отдельных аргументов, а затем собирает результаты. Итак, many pairParser
применяет pairParser
к ["one"]
, а затем к ["two"]
, и оба анализа завершаются неудачно. В этом случае вы можете заменить _ 6_ с функцией, которая соответствующим образом разбивает аргументы и соответствующим образом корректирует остальную часть программы, или (что, как я подозреваю, это более простой выбор) отказаться от pairParser
и просто обработать проанализированные аргументы пост-обработкой, поскольку в:
pairArgs :: [a] -> [(a, a)]
pairArgs = noLeftover . foldr pairNext (Nothing, [])
where
noLeftover (m, ps) = case m of
Nothing -> ps
_ -> []
pairNext x (m, ps) = case m of
Just y -> (Nothing, (x, y) : ps)
Nothing -> (Just x, ps)
manyPairsParser :: Parser [(String, String)]
manyPairsParser = pairArgs <$> many (argument str (metavar "s1 s2.."))
GHCi> testParser manyPairsParser []
Just []
GHCi> testParser manyPairsParser ["foo"]
Just []
GHCi> testParser manyPairsParser ["foo","bar"]
Just [("foo","bar")]
GHCi> testParser manyPairsParser ["foo","bar","baz"]
Just []
GHCi> testParser manyPairsParser ["foo","bar","baz","quux"]
Just [("foo","bar"),("baz","quux")]
(Обратите внимание, что в приведенной выше демонстрации я обрабатываю сбой, возвращая пустой список пар и учитывая, что нечетное количество аргументов должно привести к сбою. Вам нужно будет внести некоторые изменения, если вы хотите другое поведение.)
person
duplode
schedule
20.07.2015