2015-04-12 1 views
4

У меня есть функция, которая имеет подписьВозьмем один последующее значение из списка дополнительных Парсеров

tryParseAllFilesInDir :: FilePath -> [Parsec ByteString() (Maybe a)] 

Он пытается проанализировать все файлы в директории с определенной Parser. Это то, что только один файл на самом деле будет успешным, но я не знаю, какой файл во время выполнения.

Я хочу взять список необязательных парсеров и вынести только следующее значение параметра Parser. Я не знаю, какие функции я бы использовал для достижения этого.

Мне как-то нужно идти от [Parsec ByteString() (Maybe a)] -> [Maybe a], а затем [Maybe a] -> Just a.

Если есть лучший подход к этому, я был бы признателен за это.

+0

Вы говорите «конкретный парсер», вы имеете в виду, что есть только один парсер, который должен применяться к каждому файлу? В таком случае, зачем вам нужен список парсеров? – zudov

+0

@zudov Да проверяется только один конкретный парсер. Но он используется для нескольких файлов в каталоге. – tolgap

ответ

5

Вы можете запускать синтаксические анализаторы с помощью runParser. Это даст вам список типов [Either ParseError (Maybe a)]; вы можете использовать partitionEithers, чтобы извлечь только успешные анализы.

+0

На самом деле, для меня было бы достаточно «прав». Спасибо за этот совет, на самом деле это именно то, что я ищу, но я думал иначе. – tolgap

Смежные вопросы