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

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

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

Примечание. Этот вопрос намеренно не показывает никаких исследований, поскольку на него был дан ответ в стиле вопросов и ответов.


person Uli Köhler    schedule 24.03.2014    source источник


Ответы (2)


Другая возможная реализация:

import Control.Applicative

skipWhile1 p = skip p *> skipWhile p

На самом деле это может быть быстрее, чем ответ @Uli, потому что takeWhile создает строку результата, а skipWhile - нет. Лень может сделать их эквивалентными (например, может быть, takeWhile на самом деле не строит строку, если вы ее не используете); Я не могу проверить в данный момент, чтобы убедиться в этом.

person Tarmil    schedule 24.03.2014

Вы можете использовать Control.Monad.void вместе с takeWhile1, чтобы просто игнорировать результат:

import Data.Attoparsec.Char8
import Control.Monad (void)

skipWhile1 :: (Char -> Bool) -> Parser ()
skipWhile1 = void . takeWhile1
person Uli Köhler    schedule 24.03.2014