Есть ли способ сделать правильный футляр с футляром Parsec
(скажем, мне нужен парсер, который ведет себя как stringCI
от Data.Attoparsec.Text
). Код, который делает регистр без учета регистра в Text.Parsec.Token
, просто использует char (toLower c) <|> char (toUpper c)
, но не имеет правильного футляра. Поэтому я озадачен, возможно ли это вообще.Как правильно складывать футляр с помощью Parsec
ответ
У Parsec нет никакой функции для этого встроенного устройства, но вы можете реализовать его, например. foldCase
от case-insensitive пакета и satisfy
в петле. Я не эксперт по Юникоду, поэтому я не уверен, какие дополнительные меры предосторожности вы должны предпринять, чтобы обеспечить правильность.
Пакет text-icu рекомендуется в документации по foldCase
, если вам требуются языковые преобразования; это кажется довольно всеобъемлющим.
Я до сих пор не вижу простого способа сделать это. 'satisf' работает по одному символу за раз, а' foldCase' работает над последовательностью символов. Конечно, я мог бы разложить аргумент на свой парсер (позволяет называть его 'stringCI', например, он вызван в attoparsec), но как бы я мог преобразовать (сбросить регистр) входной поток? – user1078763
@ user1078763: Хм, я полагаю, это не так просто, потому что это не преобразование по каждому символу ... Если ваша строка имеет известный конец (например, пробел), вы можете прочитать до этой конечной точки, а затем проверить ее для правильности. Кроме того, вы можете попробовать случайные складывающиеся одноэлементные строки, состоящие из каждого символа 'satisf' дает вам; это не получилось бы для контекстно-зависимых складков, хотя, как греческая сигма. – ehird
Я имею в виду, что есть одно уродливое решение, которое я могу себе представить. Повторяю «try anyChar», и случай складывает все, что вы получили до сих пор, пока оно не будет (a) соответствует аргументу сложенного аргумента для 'stringCI' или (b) длиннее, чем случай сложенный аргумент 'stringCI'. Затем преуспеть на (a) и выйти из строя (b). – user1078763
- 1. Поиск шаблона с помощью Parsec
- 2. Как отменить парсер с помощью Parsec
- 3. Как складывать элементы div с помощью JavaScript
- 4. Как складывать заголовки столбцов с помощью GTK?
- 5. Как складывать текст с помощью Markdown?
- 6. Как складывать слои div с помощью бутстрапа?
- 7. Я хотел знать, как правильно использовать переключатель/футляр
- 8. Массивы не будут правильно складывать правильные ответы?
- 9. Не удается правильно складывать взгляды в NSClipView
- 10. Позиции Parsec как смещения
- 11. Пропустить пустые строки с помощью Parsec
- 12. Получить конечную позицию с помощью Parsec
- 13. Как использовать «футляр для ног робота» с помощью Google Guice?
- 14. Группировка строк с Parsec
- 15. Как разобрать кортеж (String, Int) в Haskell с помощью parsec
- 16. Как складывать изображение с текстом
- 17. Как правильно складывать представление контейнера в верхней части представления таблицы
- 18. Как складывать два LinearLayouts?
- 19. Как складывать TextView в той же строке с помощью EditText (складывать пару строк)
- 20. Как складывать входящие данные
- 21. нежадное повторение с Parsec
- 22. Резиновый футляр с регулярным выражением
- 23. Как реорганизовать коммутационный футляр с использованием полиморфизма?
- 24. Сменный футляр с регулярным выражением
- 25. Как сделать двусмысленный синтаксический разбор с Parsec?
- 26. Как разбор строки с использованием Parsec?
- 27. Ошибки типа с Parsec
- 28. Как складывать разделы UICollectionView
- 29. Как складывать две формы?
- 30. Parsec debugging
Для немых среди нас, можете ли вы сказать, что не так с 'char (toLower c) <|> char (toUpper c)'? –
Я бы не сказал, что это неправильно, это просто отличается от фальцовки. Следующее свойство не содержит 'prop_foo s = length s == (length. FoldCase) s'. Скажем, сложение флага может изменить длину строки. – user1078763