2011-12-07 10 views
7

Estoy escribiendo un transformador de flujo de algún tipo de datos de entrada a un tipo de datos de salida. La entrada es hecha por el usuario, por lo que hay un tiempo entre los eventos. Debido a que cada entrada requiere cierta carga de recursos, me gustaría "mirar hacia el futuro", es decir, enviar todas las entradas posibles a los recursos principales de computación y precarga en función de los resultados.¿Hay mónadas que se puedan usar como un autómata?

Actualmente, siempre hay exactamente una salida después de cada entrada, pero eventualmente podría ser interesante cambiar esto.

Pude implementarlo con el transformador de Automaton de Ross Paterson. No estoy seguro de que mi solución sea óptima.

  • ¿Hay buenos ejemplos de cómo hacerlo? Tal vez incluso con el código de prueba?
  • ¿Se puede lograr con una mónada también? (Ejemplos ?, explicación de por qué es imposible?)

Editar: Después de la llamada para más detalles, añadí código aquí. Ahora lo estoy eliminando (no era comprensible) y agrego otra explicación. Mi pregunta es respondida thaugh.

Mi intención era detener el ciclo del evento principal después de cada entrada del usuario que se ha alimentado al transformador de flecha/corriente/lo que sea. Luego almacenará el estado del autómata actual y enviará todas las entradas posibles (eventos falsos) una por una al autómata y verá qué recursos se deben cargar, para almacenarlos en la memoria caché. Después del próximo evento real, usaría el caché para una mejor capacidad de respuesta. El cálculo principal no debería estar influenciado por esto.

+0

no está calificado para responder, pero las iteraciones pueden serle útiles. Vea esta biblioteca: http://hackage.haskell.org/package/enumerator ... pero las flechas parecerían una buena abstracción. Apuesto a que más detalles ayudarían a las personas a responder. – jberryman

+0

+1 en más detalles. – sclv

Respuesta

8

Todos los casos de uso que ha mencionado están cubiertos por la biblioteca Netwire. Proporciona una generalización de la flecha de autómata de Ross a una familia de wire flechas. Aún no he terminado el wiki page, pero debería darle suficiente para comenzar.

Combinando esto con Kleisli (LogicT m) para algunos monad m obtienes cables no deterministas.

Y como nota adicional: Lo que quiere no es una mónada.

+1

¡Hallo Ertes! ¿Puedes explicar por qué esto no es una mónada? – Duschvorhang

+0

@Duschvorhang: las flechas son una generalización de las mónadas. Ver [Haskell wiki> arrow] (http://haskell.org/haskellwiki/Arrow) –

+0

@Duschvorhang: puede ver una limitación similar en el ejemplo del analizador de §3.0 de John Hughes [Generalizando Mónadas a Flechas] (http: //www.ittc.ku.edu/Projects/SLDG/filing_cabinet/Hughes_Generalizing_Monads_to_Arrows.pdf) junto con una explicación cuidadosa de cómo las flechas proporcionan la expresividad necesaria. Es una buena lectura, además. – acfoltzer

Cuestiones relacionadas