Regex & String Библиотеки в Haskell - PullRequest
5 голосов
/ 10 декабря 2010

Я пытаюсь внедрить Haskell в свою повседневную жизнь, используя его для написания дополнительных сценариев и тому подобного.

readProcess удобен для получения результатов внешних команд, но я ищу, когда дело доходит до обработки результатов String. Я пришел из ruby, где регулярные выражения являются первоклассными, поэтому я привык использовать их в качестве инструмента.

Какие библиотеки мне нужно прочитать для обработки строк в haskell? Поиск совпадающих строк, вытягивание совпадающих областей строки и тому подобное?

Ответы [ 4 ]

5 голосов
/ 11 декабря 2010

Я считаю, что это хорошая отправная точка: http://www.serpentine.com/blog/2007/02/27/a-haskell-regular-expression-tutorial/ Она охватывает только основы, но не продвинутые темы, но приятно начать ИМХО.

Что следует отметить:

  • Регулярные выражения в haskell отличаются тем, что имеют перегруженные типы возвращаемых данных. Это означает, что вы можете извлечь много разных вещей из регулярных выражений. (Bool, String, [String] и т. Д.). В зависимости от типа возвращаемого вами значения, он вернет вам ответ другого типа (независимо от того, соответствует ли регулярное выражение, проверка соответствия, все соответствующие подгруппы, и т. д.) Это делается с использованием довольно сложного класса типов вуду. Приведенная выше ссылка демонстрирует основные виды, более полный список здесь
  • На самом деле в haskell есть несколько стандартных модулей, которые обеспечивают поддержку регулярных выражений (странно, но верно). В приведенном выше руководстве показан модуль POSIX, поскольку он входит в стандартную комплектацию языка Haskell. Если у вас есть cabal, вы также можете довольно легко установить другие модули регулярных выражений и использовать их вместо этого. Существует привязка pcre (regex-pcre), а также некоторые пакеты, которые работают через DFA (regex-dfa, среди прочих). Установите с помощью команды, например: cabal install regex-pcre, и вы должны быть готовы.
    • (Модули имеют стандартизированный интерфейс, разница в основном в реализации и стиле regex)
  • Там есть IS объект регулярного выражения в haskell, но вам не нужно использовать операторы совпадения = ~ или = ~~. (Просто используйте строку, преобразование происходит автоматически). Если ваша задача достаточно сложна, и вам нужен объект первого класса для разбора, рассмотрите возможность просмотра Parsec, как уже упоминалось в других ответах.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я сам на самом деле только пользователь pcre, так что я не очень много знаю о других пакетах.

4 голосов
/ 11 декабря 2010

Когда я впервые начал учить себя на Haskell, я обнаружил, что научиться использовать библиотеку синтаксических анализаторов для обработки строк было фантастическим вложением. Они могут делать все, что могут делать регулярные выражения, и многое другое, и написание синтаксических анализаторов комбинаторов - отличный способ создать интуицию о классах типов, таких как монады, аппликативные функторы и т. Д.

Я склонен использовать Attoparsec в наши дни, но Parsec , вероятно, является лучшей отправной точкой, поскольку он более широко задокументирован и обсужден, предоставляет более приятные сообщения об ошибках и т. Д.

3 голосов
/ 10 декабря 2010

Хорошее введение в регулярные выражения можно найти в Realworld Haskell

Обновление: В примечании для обработки команд и каналов и т.оформить заказ HSH .

0 голосов
/ 10 декабря 2010

В Haskell есть много замечательных библиотек регулярных выражений, но у нас есть лучшие инструменты.Давайте сейчас придерживаться стандартных строк Haskell (то есть списков Char).Основы находятся в Data.List - http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.3.0.0/Data-List.html. У вас есть строки, строки, слова, слова, перебор, отбрасывание и т. Д.Также isPrefixOf и isInfixOf и т. Д.

Вы можете в конечном итоге написать свои собственные рекурсивные функции довольно напрямую, но это тоже очень просто.Единственными действительно отсутствующими операциями являются операции разделения, для которых вы можете использовать превосходный пакет brent: http://hackage.haskell.org/package/split

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

Не все настолько эффективно, насколько это возможно, тем более что строковое представление не так эффективно.Но если / когда вы переходите к другим типам данных, основные понятия о том, как вы обрабатываете вещи, будут переводиться непосредственно из базовых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...