Реализация takeTill1 в attoparsec

Attoparsec предоставляет функцию takeWhile1, которая использует как минимум один символ.

Однако аналога для takeTill нет. Как я могу реализовать эту функцию takeTill1?

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


person Uli Köhler    schedule 26.03.2014    source источник
comment
Для downvoter: Пожалуйста, прокомментируйте, что вы считаете неправильным в этом вопросе. Простое отрицание без объяснения причин ничего не улучшит. Я предполагаю, что вы тот человек, который последовательно минусует мой пост. Если вы хотите, чтобы что-то было улучшено, я был бы признателен, если бы вы оставили комментарий вместо последовательного голосования.   -  person Uli Köhler    schedule 27.03.2014


Ответы (1)


Вам просто нужно инвертировать предикат takeWhile1 принимает (см. эту запись в блоге для описания того, как инвертировать предикаты, если вы новичок):

takeTill1 :: (Char -> Bool) -> Parser ByteString
takeTill1 p = takeWhile1 (not . p)

Также см. отличный ответ, обеспечивающий быструю реализацию skipWhile1.

person Uli Köhler    schedule 26.03.2014