Listín telefónico funcional

propuesto por josejuan

Este es muy sencillo en un lenguaje imperativo, pero a mi me parece bastante complicado en uno funcional "PURO". El requisito es usar "inmutabilidad" y "transparencia referencial". No vale usar "workarounds" para evitar la inmutabilidad y/o transparencia (eg. un subsistema de eventos). Si lo pongo en Solveet me obligo a intentar hacerlo (a ver que tal...).

Enunciado
Lo dicho, en principio se trata de usar un lenguaje funcional, aunque dos requisitos que (creo) son lo suficientemente fuertes es que el procesamiento de los datos se haga de forma inmutable y referencialmente transparente.

No importan mucho los requisitos, pero para obligarnos a no usar "workarounds" y cambiar los requisitos sobre la marcha para evitar esforzarnos, ahí van:

1. debe tener el aspecto de la típica aplicación ASCII de los 70. Da igual si se hace un repintado por líneas (como en el shell) o si se refresca el buffer de pantalla.

2. las opciones disponibles deben ser:

~~~~_1. Leer listín desde el disco. (pedirá una ruta de archivo).
~~~~_2. Guardar listín en disco. (pedirá ruta, pero sugerirá la que haya).
~~~~_3. Crear nuevo listín.
~~~~_4. Listar contactos. (irá a la pantalla de "listar").
~~~~_5. Salir.

3. al listar los contactos sale: Código, Nombre, Teléfono, algo como

~~~~_ CONTACTOS:
~~~~_ 1, Pedro, 12345
~~~~_ 2, Juan, 23456

~~~~_ 1. Editar contacto. (pide el código y va a la pantalla de edición)
~~~~_ 2. Eliminar contacto. (pide el código)
~~~~_ 3. Insertar contacto. (va la pantalla de edición)
~~~~_ 4. Volver

4. la pantalla de edición es algo como

~~~~_ CONTACTO (XXXX) (el código no se puede cambiar, si es nuevo XXXX="nuevo")
~~~~_ 1. Nombre: NOMBRE (si pulsan 1 permite meter el nombre)
~~~~_ 2. Teléfono: TELEFONO (si pulsan 2 permite meter el teléfono)
~~~~_ 3. Descartar cambios y volver.
~~~~_ 4. Guardar cambios y volver.

5. la pantalla de eliminar contacto es algo como

~~~~ INDIQUE CÓDIGO: (aquí mete el código eg. 123)

luego debe aparecer

~~~~_ ¿ELIMINAR (XXXX) NOMBRE TELEFONO?
~~~~_ 1. Sí
~~~~_ 2. No

6. el código máximo asignado se debe guardar en el listín, no debe ser posible que si borro el contacto con mayor código X, luego al crear uno me asigne X; un nuevo contacto tiene siempre un código diferente a cualquier otro contacto que haya existido o exista en el listin.

7. en las opciones precisas, se pedirá confirmación (¿seguro? (s/n)), por ejemplo, si hemos creado un listín nuevo y luego queremos leer de disco dirá que perderemos el creado. Pero si hemos cargado uno de disco y NO hemos realizado ninguna acción que lo modifique, NO DEBERA preguntar (porque no ha habido cambios).

En fin, creo que no me dejo nada.

RECUERDA, inmutabilidad y transparencia referencial

¡Ánimo!

Ver todo el enunciado

Preguntas sobre el desafío

¿Tienes dudas sobre el desafío? plantéala aquí

Plantea tu pregunta

1 Solución

1voto
Listín telefónico funcional en Haskell
por

josejuan

hace 6 años

Debo reconocer que ha sido mas fácil de lo que pensaba. El código seguro que es mucho más verbose de lo necesario, pero por algo se empieza :) Por otro lado, lo suyo es separar el código en al menos tres archivos (estructuras, código puro, código impuro) pero aquí (en solveet) es más cómodo poner todo junto.

Dar mi solución