2011-07-13 9 views
10

¿Existe (o es posible que tenga) un reactivo Parsec (o cualquier otro analizador funcional puro) en Haskell?Haskell: FRP Reactiva Parsec?

En pocas palabras, quiero alimentar el analizador yo mismo char por char y obtener resultados tanto como alimentar lo suficiente para obtener resultados.

O mucho más simple, ¿cómo puedo hacerlo en foldr o al menos map?

¿Necesitamos una versión diferente de ellos para admitir este comportamiento reactivo?

EDITAR

Mi pregunta es acerca de FRP en particular. Usé un analizador sintáctico como ejemplo, que fue lo mejor que pude pensar para aclarar mi pregunta y dar una idea general de lo que necesito.

Creo que FRP no se trata solo de la IU, ¿verdad?

+5

Attoparsec apoya el análisis incremental de si eso es lo que quiere? – Masse

Respuesta

8

No se puede hacer el análisis en línea en Parsec, tiene que consumir todas las entradas para determinar si hay un análisis válido o no.

Sin embargo, hay alternativas. Una posibilidad es usar el Utrecht parser combinators, tiene un análisis en línea entre sus características.

8

No creo que sea correcto llamar a este "FRP", el nombre adecuado para este tipo de cosas es online algorithm, lo que significa que el analizador produce una salida tan pronto como se recibe la entrada. (A diferencia del algoritmo fuera de línea, donde el analizador recibe toda la entrada por adelantado y produce una salida de eso.)

En Haskell, la evaluación diferida hace que sea fácil escribir algoritmos en línea. Malcom Wallace ha desarrollado un conjunto especial de combinadores de analizadores para el análisis en línea que utilizan evaluación perezosa.

6

Puede hacer el análisis en línea en Parsec, pero para hacerlo debe colocarlo encima de algo así como un iteratee.

Parsec 3 es capaz de trabajar con tipos de flujo arbitrarios, por lo que puede crear una instancia de Stream que vea la 'corriente' actual como una posición y use una iteración para recuperar el valor en esa posición.

Uno de estos ejemplos es el iteratee-parsec package.

Otro enfoque es proporcionada por parsing trifecta talk on iteratees and parsec (PDF aviso):

Un compromiso es construir un tipo iteratee similar que amortigua los últimos fragmentos del pedazo en lugar de todos ellos para que pueda retener la utilización del espacio acotado, y confíe en la maquinaria iteratee para retroceder más allá de eso. Esto es lo que uso actualmente, pero no tengo ningún código en línea para eso.

Una vez que tiene el control invertido ejecutando Parsec en la parte superior de un Iteratee, es bastante fácil alimentarlo ingresando un carácter a la vez y ver si ha logrado reconocer algo todavía.

+0

@ KA100 debe aceptar esta respuesta. –

1

Tenga una mirada en attoparsec-conducto, con el analizador correcta puede ser una forma útil para convertir un flujo de bytes en una corriente de estructuras de datos analizados

Cuestiones relacionadas