Пропуск пробелов, исключая переводы строк в attoparsec

Аттопарсек обеспечивает функцию skipSpace,

Эта функция использует все доступные пробелы.

Как я могу реализовать функцию skipSpaceNoNewline который пропускает любые пробелы, кроме \n а также \r\n?

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

2 ответа

Решение

Вы можете объединить skipWhile а также isEndOfLine (что соответствует обоим \n а также \r\n).

Используя лямбда-функцию, вы можете объединить их в skipWhile Предикат, пропускающий любые пробелы, кроме новых строк.

skipSpaceNoNewline = skipWhile (\x -> isSpace_w8 x && not (isEndOfLine x))

Почему бы просто не использовать skipSpaceNtoNewLine = filter (not.isSpace)?

Редактировать: я был неправ. isSpace бесполезен. я думал isSpace '\n' является False но это True, Просто проверьте наличие места напрямую:

[ghci] putStrLn $ filter (/=' ') $ ";df g; lkdfg\n l sd;lfk sdf"
;dfg;lkdfg
lsd;lfksdf

Или чтобы убедиться, что вы фильтруете правильные вещи:

[ghci] putStrLn $ filter (\m-> m `notElem` "\t\f\v") $ ";df g; lk\vdfg\n l sd;lfk sdf"
;df g; lkdfg
 l sd;lfk sdf

Итак, ваша функция становится:

skipSpaceNtoNewLine = filter  (\m-> m `notElem` "\t\f\v") 

Извините за путаницу.

Другие вопросы по тегам