functional-programming - qué - programacion funcional javascript
¿Cómo se aplica la programación funcional a las simulaciones? (6)
El tío Bob ha estado jugando con Clojure últimamente y, en particular, ha escrito un simulador orbital como su ejemplo más público.
Algunos enlaces:
Además de la pregunta general en el título,
- ¿Cómo se acercan los programadores funcionales y los lenguajes funcionales al dominio de las simulaciones, que parecen manejarse de forma más natural con lenguajes orientados a objetos?
- ¿Hay ejemplos de código abierto de simulaciones complejas escritas en un estilo funcional (en su mayoría)?
- ¿Qué cambios de perspectiva necesitaría un programador de OO para abordar simulaciones desde un paradigma funcional?
Lo pregunto mientras aprendía cómo el creador de Clojure, Rich Hickey, buscó específicamente dominar la "complejidad incidental" de la programación OO y el estado mutable, por ejemplo, la separación de identidad y estado de Clojure tiene mucho sentido (Hickey''s ants.clj está en el estudio lista). Otra área relacionada es el uso de la programación funcional para juegos, que a menudo son simulaciones con muchas "cosas" con estado por todas partes; Hay algunos artículos / artículos escritos sobre FP y juegos, más serían bienvenidos.
Tal vez los programadores funcionales experimentados pueden proporcionar antecedentes y consejos adicionales sobre cómo reorientar el pensamiento de uno hacia el estilo funcional, específicamente para simulaciones. ¡Gracias por adelantado!
Estoy escribiendo un juego en Clojure, usando un estilo mayormente funcional. Por ejemplo, todo el estado del juego se modela como una estructura de datos inmutable.
Esto ha requerido algo de codificación ligeramente enrevesada. Por ejemplo, con frecuencia terminas creando funciones con una gran cantidad de parámetros para pasar por varios elementos del estado del juego y asegurarte de que la aplicación de las actualizaciones del estado del juego pase a la última versión del juego.
Pero también ha arrojado algunas ventajas realmente agradables, por ejemplo, la concurrencia ha demostrado ser bastante trivial y puedes hacer cosas divertidas como clonar todo el estado del juego para ejecutar diferentes simulaciones en la IA.
En general, estoy encantado con Clojure como lenguaje para simulaciones / juegos.
Basado en esta experiencia, las cosas que creo que mejorarían Clojure para juegos / simulaciones serían:
- Mejor soporte para primitivas, especialmente como parámetros de función y valores de retorno
- Implementación de funciones básicas del lenguaje que son menos difíciles en las asignaciones de memoria (¡la presión del GC es un problema para los juegos interactivos!)
Puedes ver una versión temprana del juego aquí: Ironclad - Generales de Steam . Es básicamente un juego de estrategia con temática steampunk.
La respuesta de Michal es excelente, pero pensé que agregaría un par de otros buenos ejemplos que personalmente he encontrado útiles / interesantes.
El primero es un post (y código) sobre la dinámica de fluidos funcionales de Lau Jenson. Aunque definitivamente va por la ruta mutable para la velocidad aquí, el estilo es bastante funcional. Apostaría por Clojure 1.3 que esto podría hacerse (¡en su mayoría!) De manera inmutable con un rendimiento razonable.
El siguiente es un juego simple de Snake implementado en Clojure. Aunque es fácil de leer en aproximadamente una hora, y el estilo es realmente agradable y cohesivo.
Además, un código ordenado para ver (¡creo!) Es el modelado de código de redes neuronales. Jeff Foster tiene un código de percepción de una sola capa y algunas revisiones idiomáticas más del código . Vale la pena mirar, incluso si no estás familiarizado con NNs. También tiene algunos mensajes más recientes sobre dinámica de fluidos, aunque esta vez en Haskell. ( Parte I y Parte II ) También es divertido, creo, su implementación del Juego de la Vida (y la Parte II ).
Finalmente, como Michal mencionó antes que yo, Brian Carper está trabajando en un juego de rol en Clojure . recientemente publicó algunas ilustraciones para el juego, así que apuesto a que aún se está trabajando en él;)
Me encanta usar las bibliotecas de secuencias para trabajar con toneladas de datos; se siente más natural usando abstracciones como map
y reduce
, y herramientas divertidas y prácticas como juxt
lugar de simples juxt
imperativas. He pagado un impuesto, he encontrado, mediante el uso de Clojure / funcional langs en la reimplementación de algoritmos imperativos bien conocidos y bien implementados.
¡Que te diviertas!
Las simulaciones son una forma de intérprete, que son fáciles de escribir en un estilo funcional. También pueden diseñarse como simuladores de optimización automática , basados en el tratamiento de ellos como un compilador.
No estoy seguro de estar a la altura del desafío de redactar un análisis exhaustivo del problema planteado en la pregunta, pero al menos puedo publicar algunos enlaces interesantes en el frente de FP vs. juegos:
Jörg W. Mittag proporciona una serie de ejemplos interesantes en esta respuesta a una pregunta sobre la programación de Haskell del "mundo real" (con enlaces a algunos escritos interesantes: la serie Purely Functional Retrogames realmente vale la pena leerla).
En Clojure land, Phil Hagelberg ha implementado un juego de aventuras basado en texto para su screencast PeepCode en la programación de Clojure; El código está disponible en GitHub . Luego está el proyecto de rol de Brian Carper; aún no se ha publicado ningún código y solo ese post de hace un tiempo (aunque se veía muy bien, así que vamos a unirnos para presionar a Brian para que continúe ;-)). Finalmente, here un ejemplo de un juego simple que utiliza Penumbra (por alguna razón, posiblemente no relacionada con Clojure), no pude hacer que funcionara, pero puede que lo haga, además de que hay una reseña adjunta.
En cuanto a las simulaciones, estudiar ants.clj
es una gran idea. Además, recuerdo haber visto una serie de conferencias basadas en SICP de un curso introductorio de programación en UC Berkeley (creo ...) disponible en algún lugar (el 90% estaba en su canal de YouTube); tienen tres conferencias sobre OOP en Scheme y creo que mencionan la simulación como un dominio que proporciona buenos casos de uso para el enfoque. Tenga en cuenta que tengo un recuerdo bastante vago de este, así que es difícil para mí decir lo útil que puede ser para usted.
Para complementar las otras respuestas: Existe una disciplina llamada Programación reactiva funcional que aborda el problema de la representación funcional de sistemas que cambian en el tiempo y reaccionan a eventos externos. Ver