Patrones de interfaz de usuario en lenguajes funcionales

11

Me gustaría comenzar a jugar con ClojureScript, pero estoy desconcertado sobre algunos puntos. Mi problema es cuál es una buena manera de lidiar con los cambios de estado derivados de la interacción del usuario, cuando intenta trabajar funcionalmente.

Déjame darte un par de ejemplos. Tengo en mente las aplicaciones que se ejecutan en el navegador, pero creo que el problema es más general. Por supuesto, algo va a cambiar, el DOM al menos. Pero me gustaría saber cómo organizar el resto del código para trabajar con estructuras de datos inmutables.

1) Di que quiero adjuntar algunos eventos a algún objeto DOM. Esto no es difícil de hacer de una manera principalmente funcional: cuando crea el nodo, lo adjunta un mapa hash con los diversos controladores de eventos. Pero considere el caso en el que está utilizando la delegación de eventos. Luego, cuando cree un nuevo nodo, puede adjuntar un controlador de eventos a algún nodo principal que probablemente ya exista. Por lo tanto, tendría que cambiar el hash asociado al nodo ya existente.

2) Digamos que estoy diseñando un módulo de autocompletar para un campo de entrada. Cada vez que el usuario presiona una tecla, puedo hacer una llamada a un servidor para obtener las sugerencias. Esto es facil. Pero ahora supongamos que quiero optimizarlo un poco. Si sé que todos los resultados coinciden, foono tiene sentido volver a preguntar por todos los resultados foobar; Solo puedo filtrar el primero. Entonces necesito construir algún tipo de caché. Este caché se actualizará cada vez que el usuario inserte una nueva palabra que no sea un superconjunto de las palabras ingresadas previamente. Nuevamente: ¿cómo modelo el caché? La forma más razonable parece ser un mapa hash que asigna palabras a resultados, pero debe ser mutable.

¿Puede sugerir algunos patrones que faciliten la incorporación de cambios debido a la interacción del usuario en un diseño funcional?

Andrea
fuente
44
Búsqueda "Programación funcional reactiva".
dan_waterworth
Esto no es exactamente lo mismo, pero con las plantillas XSLT (sin efectos secundarios) que coinciden con los eventos DOM iniciados por un usuario, enfrentamos un problema similar en Saxon-CE. La forma en que me gusta verlo es que el usuario está activando el cambio de estado, no el XSLT, así que eso está bastante bien. La clave es garantizar que el código que gestiona la interacción del usuario y los cambios posteriores en el estado estén muy separados del resto.
pgfearo
@pgfearo ¿Tiene algún consejo sobre cómo organizar el código para que la interacción del usuario se mantenga lo suficientemente separada del resto?
Andrea
No hay una buena manera de lidiar con los cambios de estado cuando se trabaja funcionalmente, ya que la programación funcional no tiene estado.
Old Pro
3
@Old Pro: Esto no es del todo correcto. Mientras que en la programación funcional usted define un cálculo utilizando la aplicación de función en lugar de un efecto secundario, eventualmente debe guardar el resultado del cálculo en alguna parte. El objetivo de FP está en restringir el uso del estado al mínimo, mientras que en la programación imperativa, la transformación del estado de forma incremental (por efectos secundarios) es la herramienta básica para definir un cálculo.
Giorgio

Respuestas:

3

Como se menciona en los comentarios, debe buscar "Programación funcional reactiva" y también debe leer algunas de las publicaciones en http://prog21.dadgum.com/archives.html . Más específicamente, probablemente debería leer " No se enamore de su tecnología ", " Escriba el código como acaba de aprender a programar ", " La programación funcional no funciona (y qué hacer al respecto) ", y tal vez un algunos otros

Evitar completamente la mutabilidad y los efectos secundarios es prácticamente imposible. Incluso los programadores de Haskell de vez en cuando harán uso del unsafePerformIOparadigma puramente funcional, libre de efectos secundarios y de tipo estático para hacer ciertas cosas. Si se embarca en este proyecto como un ejercicio puramente académico, siga adelante y evite la mutabilidad y los efectos secundarios tanto como sea posible, pero si está tratando de construir un producto utilizable en una fecha límite, entonces ningún patrón lo salvará.

davidk01
fuente