Haskell: регулярные выражения и данные. Текст - программирование
Подтвердить что ты не робот

Haskell: регулярные выражения и данные. Текст

При обработке больших объемов текстовых данных рекомендуется использовать Data.Text вместо собственных строк haskells. Проверьте, сделано. Но как насчет регулярных выражений? Имеется ли библиотека регулярных выражений, специализированная по Data.Text? Насколько я могу судить, все библиотеки регулярных выражений работают над родными строками Haskell или даже хуже CStrings.

4b9b3361

Ответ 1

Я понятия не имею о Haskell, но чтение документации всегда является хорошей идеей независимо от языка программирования.

Чтобы использовать расширенное и очень богатое семейство функций для работы с Текст Unicode (включая нормализацию, регулярные выражения, нестандартные кодировки, нарушение текста и локали), см. текст-icu пакет: http://hackage.haskell.org/package/text-icu

Точнее Data.Text.ICU.Regex

Ответ 2

Экосистемы регулярного выражения и Haskell

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

Для этого есть веская причина. Finate State Automata являются довольно загадочными, несколько утомительными для реализации и трудноэффективными. Зачем изобретать колесо?

Так что же случилось с Haskell? Хорошо, что эти хорошо известные библиотеки работают на массивах 8-битных слов, заканчиваемых байтом NUL - a CString в номенклатуре Haskell. Регулярными строками в Haskell являются списки Char. (довольно буквально: type String = [Char]). Это вызывает две проблемы: 1) char - это один символ юникода, а не 8-битовый байт. (GHC хранит char как UTF16 внутри) и 2) список не является массивом. Это означает, что если мы хотим сделать Regex в Haskell, нам нужно либо преобразовать наш текст в CStiring, либо сделать внешний вызов для чего-то вроде PCRE или реализовать эффективные автоматические автоматы состояний и регулярный синтаксический анализатор.

Преобразование unicode в ascii - операция с потерями и рискованностью. Некоторые библиотеки делают некоторые предположения о строке, над которой они работают, и делают преобразование для вас, другие заставляют вас создавать CString для них, чтобы вы могли понять, что делать, когда отображается в тексте тура.

Итак, что насчет Data.Text? Ну, это, по крайней мере, массив, но внутренне это массив UTF16. До сих пор можно преобразовать в 8-битный CString, но не с большой эффективностью. Существует также возможность использования механизма регулярных выражений с поддержкой unicode. Международные компоненты для Unicode (ICU) такая библиотека и есть привязка к нему в пакете text-icu. Сама природа Unicode означает, что этот пакет менее эффективен, чем PCRE, поэтому некоторые люди предпочитают использовать привязки к последним. Вам нужно будет решить, каково ваше предпочтение, основанное на том, для чего вы используете регулярные выражения.