2010-12-10 5 views
5

Я пытаюсь представить Haskell в своей повседневной жизни, используя его для написания случайных сценариев и т. Д.Regex & String Libraries in Haskell

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

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

+1

вы можете найти отличный обзор по haskell wiki: http://www.haskell.org/haskellwiki/Regular_expressions – 2010-12-10 15:09:08

ответ

4

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

Things отметить:

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

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

3

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

Update: На стороне записки, для командной обработки и труб и таких, проверок HSH.

0

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

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

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

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

+0

Использование `isPrefixOf` на` tails` строки не _better_, хотя это хуже. Это больше PITA, чтобы писать, и это медленнее, чем хороший сопоставитель строк. – rampion 2010-12-10 18:31:11

+0

Как я уже сказал, «не все максимально эффективно». `isInfixOf` - это то, о чем я говорил. Его вряд ли «больше PITA», чтобы писать. И, как я уже сказал, концепция ядра трансформируется прямо. – sclv 2010-12-10 19:50:30

3

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

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