teoria racionalismo preestablecida obras monadologia monadas monada leibniz espiritual educatina conocimiento armonia haskell monads

haskell - racionalismo - Usos creativos de las mónadas



monadologia leibniz pdf (8)

Estoy buscando usos creativos de mónadas para aprender. He leído en alguna parte que las mónadas se han usado, por ejemplo, en IA, pero al ser un novato de la mónada, no veo cómo.

Por favor incluya un enlace al código fuente y ejemplos de uso. No hay mónadas estándar por favor.



Me gustaría enumerar un par de mónadas aún no mencionadas en otras respuestas.

Enumeración y mónadas de búsqueda ponderadas

La mónada Omega se puede utilizar para atravesar infinitas listas de resultados. Comparar:

>>> take 10 $ liftM2 (,) [0..] [0..] [(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9)] >>> take 10 $ runOmega $ liftM2 (,) (each'' [0..]) (each'' [0..]) [(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0)]

Con una mónada WeightedSearch un poco más avanzada, también es posible asignar pesos a los cálculos para que los resultados de los cálculos con pesos más bajos aparezcan primero en la salida.

Acumulando errores de mónada

Un útil These tipo de datos forma una Monad similar a Either , pero puede acumular errores en su lugar. El paquete también define la clase MonadChronicle así como el transformador de mónada ChronicleT basado en These .



También hay LogicT (transformador de mónada de retroceso con operaciones y poda justas).

Tiene un buen valor para los algoritmos de búsqueda de inteligencia artificial debido a sus construcciones para las disyunciones justas, por ejemplo, permitiendo fácilmente cálculos que tienen éxito un número infinito de veces para ser combinados ( entrelazados ).

Su uso se describe en el documento ICFP''05, Backtracking, Interleaving y Termining Monad Transformers


Un uso interesante de la mónada es el análisis sintáctico. Parsec es el ejemplo estándar.



Harpy , un paquete para la generación en tiempo de ejecución del código máquina x86, utiliza una mónada de generación de código . De la descripción:

Esta es una mónada combinada de estado de lectura que maneja todos los detalles de manejo de búferes de código, emisión de datos binarios, reubicación, etc.

Todas las funciones de generación de código en el módulo Harpy.X86CodeGen viven en esta mónada y utilizan sus funciones de informe de errores, así como el estado interno mantenido por la mónada.

El usuario de la biblioteca puede pasar un entorno de usuario y un estado de usuario a través de la mónada. Este estado es independiente del estado interno y puede ser utilizado por bibliotecas de generación de código de nivel superior para mantener su propio estado en las operaciones de generación de código.

Encontré este ejemplo particularmente interesante porque creo que este patrón no es infrecuente: inventé algo bastante similar para generar un conjunto de mensajes internos para mi aplicación basados ​​en mensajes recibidos de un feed de datos del mercado (de stock). Resulta ser una forma extremadamente cómoda de tener un marco de trabajo para realizar un seguimiento de varias cosas "globales" mientras se componen operaciones simples que por sí mismas no mantienen ningún estado.

Avancé un paso más con su idea de tener un estado de usuario (que llamo "subestado") que también podría pasar a través de la mónada: tengo un mecanismo para desconectar y restaurar el estado durante la ejecución de la mónada:

-- | Given a generator that uses different substate type, convert it -- to a generator that runs with our substate type. As well as the -- other-substate-type generator, the caller must provide an initial -- substate for that generator and a function taking the final substate -- of the generator and producing a new substate of our type. This -- preserves all other (non-substate) parts of the master state touched -- by the generator. -- mgConvertSubstate :: MsgGen msg st'' a -> st'' -> (st'' -> st) -> MsgGen msg st a

Esto se usa para subgrupos de combinadores que tuvieron su propio estado necesario por un período corto. Se ejecutan solo con su estado, sin saber nada sobre el estado del generador que lo invocó (lo que ayuda a que las cosas sean más modulares), y sin embargo, esto preserva cualquier estado no específico del usuario, como la lista actual de mensajes generados y el conjunto actual de advertencias o errores, así como el flujo de control (es decir, permitir abortos totales fluyan hacia arriba).