Tengo un algoritmo que opera en un IntMap que creo que sería mejor expresar de forma imperativa. Es decir, me gustaría decir cosas como:¿Existe una instancia de mónada para Data.Map/Data.IntMap?
- Busque el valor X en el mapa.
- Si coincide con un criterio, elimine este valor del mapa.
- Haz un bucle hasta que no existan más valores en el mapa.
Esto sería bastante trivial para expresar como una recursión de dos líneas, pero el algoritmo real es un poco más compleja, que implica varias operaciones de búsqueda y supresiones, así que me gustaría ser capaz de expresarlo en notación do
.
¿Existe un "Estado" estándar -como mónada donde el estado está representado por Data.Map
o Data.IntMap
, donde puedo hacer algo como:
do
insert 5 20
(ma, mv) <- lookup 4
case mv of
Just v -> delete (fromJust ma)
Nothing -> return()
Honestamente no estoy seguro de cómo expresar mejor esto. debido a lookup
parece beneficiarse de algún tipo de pila MaybeT IntMap m
o algo así.
lo hice hacer un poco de trabajo tratando de definir mi propia mónada estado basado en Data.IntMap
, incluso llegó tan lejos como hacer insert
y delete
trabajo, pero tiene un poco atascado con la forma de hacer frente a lookup
. En general, creo que esto probablemente sea algo que alguien ya ha resuelto, pero no puedo encontrarlo en Hackage.
Wow. Gracias. Realmente necesito acostumbrarme a usar transformadores. Este ejemplo es de gran ayuda para mostrar cómo usarlos de manera práctica. Todos los tutoriales de mónada le muestran cómo crear uno desde cero, pero rara vez le muestran cómo aprovechar lo que ya está disponible. – Steve
@Steve Lo que me ayudó a entender los transformadores de mónada es simplemente pensar en ellos como una pila de mónadas o una cebolla con capas y los campos de registro o funciones de ejecución de cada tipo de transformador de mónada aparece/descascara una capa para revelar el nivel siguiente. –