Actualización de registro cuando se hace referencia por múltiples estructuras de datos

Supongamos que tengo un registro, por ej.Person, y quiero poder buscar a esta persona a través de múltiples estructuras de datos. Tal vez haya un índice por nombre, otro índice por el código postal de la persona y otro índice por la latitud y longitud actuales de la persona. Y tal vez muchas más estructuras de datos. Todo lo cual existe porque necesito buscar eficientemente una persona o personas con diferentes criterios.

Si solo necesitoleer los atributos de una persona,esto no es problema. Pero ahora supongamos que necesito buscar a una persona utilizando una de estas estructuras de datos y luegoactualizar Los datos de la persona.

En un lenguaje OOP, cada estructura de datos apuntaría a la misma persona en la memoria. Por lo tanto, cuando actualiza una, también está actualizando implícitamente los referentes de las otras estructuras de datos. Esta es prácticamente la definición de efectos secundarios e impureza. Sé que es totalmente contrario al paradigma de Haskell, y no espero que Haskell funcione de esta manera.

Entonces, ¿cuál es la manera haskell-ish de hacerlo? Para que quede claro, el problema es el siguiente: busco a una persona por una estructura de datos, y la paso a esa persona (y tal vez a otros datos arbitrarios) en una función de tipoArbitraryData -> Person -> Person. ¿Cómo propagar este cambio en todas las diversas estructuras de búsqueda?

Como un recién llegado a Haskell, mi primer instinto es reconstruir cada estructura de búsqueda con la persona recién actualizada, cada vez que actualizo a una persona. Pero eso parece ser una gran ceremonia, con muchas oportunidades para que yo la arruine de una manera que GHC no puede detectar, y en absoluto elegante. Haskell es conocido por su elegancia, y no puedo imaginar que carezca de una solución elegante para un problema tan común y básico. Así que creo que me estoy perdiendo algo.

Para referencia, esta pregunta se expande en algunos de los temas que estaba discutiendo en las siguientes preguntas:

Múltiples estructuras de búsqueda para los mismos datos: ¿Duplicación de memoria?

Identidad de objetos de simulación en Haskell

Editar

Una solución que se me cruzó por la mente: no mantenga una copia de cada estructura de búsqueda en su estado principal. Solo mantenga una lista única de todas las personas que existen, y eso es lo único que necesitamos actualizar cuando actualizamos a una persona. Cada vez que necesite buscar, por ejemplo, un código postal, pase la lista de todas las personas a una función que genere una estructura de datos eficiente con código postal. A continuación, realice la búsqueda en el resultado.

No sé si esto sería eficiente. Si resulta en que la CPU vuelva a calcular la estructura de búsqueda en cada uso, es inaceptable. Pero sé que Haskell a veces puede evitar reevaluar expresiones idénticas. Lamentablemente, todavía no he descubiertocuando este es el caso. Así que no sé si este enfoque es viable.

Así que en otras palabras: ¿Puedo escribir mis funciones?como si ¿Están calculando la búsqueda cada vez, cuando en realidad GHC lo optimizará para los casos en que los datos subyacentes no hayan cambiado? Porque eso sería unmuy Solución elegante al problema que he identificado anteriormente.

Respuestas a la pregunta(7)

Su respuesta a la pregunta