2010-12-10 12 views
5

Estoy tratando de introducir a Haskell en mi vida diaria utilizándolo para escribir guiones incidentales y cosas por el estilo.Regex & String Libraries en Haskell

readProcess es útil para obtener los resultados de los comandos de exterior, pero me encuentro buscando a la hora de procesar los resultados de String. Vengo de Ruby, donde las expresiones regulares son de primera clase, así que estoy acostumbrado a tenerlas como herramienta.

Cualquier biblioteca que deba leer para hacer el procesamiento de cadenas en haskell? ¿Buscando líneas coincidentes, extrayendo regiones coincidentes de una cadena, y tal?

+1

puedes encontrar una gran encuesta en la wiki de haskell: http://www.haskell.org/haskellwiki/expresiones_regionales –

Respuesta

4

Me pareció un buen punto de partida: http://www.serpentine.com/blog/2007/02/27/a-haskell-regular-expression-tutorial/ Solo cubre lo básico, no hay temas avanzados, pero es genial comenzar en mi humilde opinión.

A tener en cuenta:

  • expresiones regulares en Haskell son diferentes, ya que han sobrecargado tipos de retorno. Esto significa que puede sacar muchos tipos diferentes de cosas de una coincidencia de expresiones regulares. (Bool, String, [String], etc.) Dependiendo del tipo de devolución que use, le devolverá un tipo diferente de respuesta (si la expresión regular coincide, la prueba del emparejamiento, todos los subgrupos coincidentes, etc.) Esto se hace utilizando algún vudú de clase de tipo bastante complejo. El enlace de arriba muestra los tipos básicos, una lista más completa es here
  • En realidad, existen múltiples módulos estándar en haskell que proporcionan soporte de expresiones regulares (extraño pero verdadero).El tutorial anterior muestra el módulo POSIX, porque viene de serie en haskell. Si tiene cabal, también puede instalar fácilmente otros módulos de expresiones regulares y usarlos en su lugar. Hay un enlace pcre (regex-pcre), así como algunos paquetes que funcionan a través de DFA (regex-dfa, entre otros). Instale usando un comando como: cabal install regex-pcre y debería estar listo para comenzar.
    • (Los módulos tienen una interfaz estandarizada, la diferencia está principalmente en la implementación y el sabor de expresiones regulares)
  • Hay ES un objeto de expresiones regulares en Haskell, pero que realmente no lo necesita utilizar the = ~ or = ~~ match operadores. (Solo use una cadena, la conversión ocurre automáticamente). Si su tarea es lo suficientemente complicada como para querer un objeto de análisis de primera clase, considere buscar en Parsec como se ha mencionado en otras respuestas.

DESCARGO DE RESPONSABILIDAD: Yo solo soy realmente un usuario pcre, así que no sé mucho sobre los otros paquetes.

3

Una buena introducción a las expresiones regulares se encuentra en Realworld Haskell

Actualización: En una nota lateral, para el procesamiento de comandos y tuberías y tal, la caja HSH.

0

Hay un montón de grandes librerías de expresiones regulares en Haskell, pero tenemos herramientas mejores. Vamos a seguir con las cadenas Haskell estándar por ahora (es decir, listas de Char). Los conceptos básicos están en Data.List - http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.3.0.0/Data-List.html. Tiene líneas, líneas, palabras, unwords, takewhile, dropwhile, etc.etc. También isPrefixOf y isInfixOf, etc.

Puede terminar escribiendo sus propias funciones recursivas de manera bastante directa, pero eso también es muy sencillo. Las únicas operaciones que realmente faltan son las que se dividen, para lo cual puede usar el excelente paquete de Brent: http://hackage.haskell.org/package/split

Fundamentalmente, la noción es que desea hacer un procesamiento incremental de flujos de caracteres.

No todo es tan eficiente como sea posible, especialmente porque la representación de la cadena no es tan eficiente. Pero si/cuando pasa a otros tipos de datos, los conceptos básicos de cómo procesa cosas se traducirán directamente de cadenas básicas.

+0

Usar 'isPrefixOf' en' colas' de una cadena no es, sin embargo, peor, es peor. Es más un PITA para escribir, y es más lento que un buen comparador de cuerdas. – rampion

+0

Como dije "no todo es lo más eficiente posible". 'isInfixOf' es de hecho a lo que me refería. Sin embargo, es difícil decir "más de un PITA". Y como dije, el concepto central se traduce directamente. – sclv

+1

@rampion: también debo agregar que si estás en el punto en el que te preocupa un "buen mezclador de cuerdas" no deberías usar '[Char]' en absoluto - Data.Text tiene un buen matcher fuera de la caja, y hay un excelente paquete de búsqueda de subcadenas para cadenas de bytes también. – sclv

3

Cuando me estaba enseñando a mí mismo Haskell por primera vez, descubrí que aprender a usar una biblioteca de combinación de analizadores para el procesamiento de cadenas era una inversión fantástica. Ellos pueden hacer todo lo expresiones regulares pueden hacer, y mucho más, y escribir analizadores de combinadores es una gran manera de construir intuiciones acerca de las clases de tipos como mónadas, funtores aplicativos, etc.

tiendo a usar Attoparsec estos días, pero Parsec es probablemente un mejor punto de partida porque está más ampliamente documentado y discutido, proporciona mensajes de error más agradables, etc.

+0

Todavía no he llegado al capítulo "Parsec", pero estoy deseando que llegue. :) –

+0

suena como una buena idea. – rampion