2010-08-07 16 views
15

Además de la cuestión general en el título,¿Cómo se aplica la programación funcional a las simulaciones?

  • ¿Cómo programadores funcionales y lenguajes funcionales se acercan al dominio de simulaciones, que parecen ser más natural manejada por los lenguajes orientados a objetos?
  • ¿Hay ejemplos de código abierto de simulaciones complejas escritas en un estilo (principalmente) funcional?
  • ¿Qué cambios de perspectiva necesitaría un OO-programador para abordar las simulaciones desde un paradigma funcional?

Pregunto esto mientras conozco cómo el creador de Clojure, Rich Hickey, buscó específicamente controlar la "complejidad incidental" de la programación OO y el estado mutable, p. Ej. La separación de Clojure de identidad y estado tiene mucho sentido (Hickey's ants.clj está en la lista de estudio). Otra área relacionada es el uso de programación funcional para juegos, que a menudo son simulaciones con muchas "cosas" con estado en todo el lugar; hay algunos artículos/documentos escritos sobre FP y juegos, más serían bienvenidos.

Quizás los programadores con experiencia puedan proporcionar antecedentes y consejos adicionales sobre cómo reorientar el pensamiento a un estilo funcional, específicamente para simulaciones. ¡Gracias por adelantado!

+0

Gracias a todos, por sus útiles respuestas hasta el momento. Parece que todavía no hay una referencia "canónica" sobre cómo hacer la transición de simulaciones de paradigmas OO a simulaciones de paradigmas funcionales, pero al leer todos los enlaces y códigos compartidos, tal vez arriesgue escribirlo yo mismo. :) – limist

+1

Hice una pregunta similar hace algunos años, y estoy incluyendo un enlace a continuación porque hay algunas buenas respuestas, y pueden ser útiles para otras personas interesadas en este tema. http://stackoverflow.com/questions/718935/is-a-functional-language-a-good-choice-for-a-flight-simulator-how-about-lisp –

+0

@Ballpark - gracias por el enlace, tuve ha visto su pregunta antes y también ha aprendido de ella. – limist

Respuesta

4

No estoy seguro de que estoy a la altura del desafío de escribir un análisis exhaustivo del problema planteado en la pregunta, pero al menos puedo publicar algunos enlaces interesantes en el frente FP vs. juegos:

Jörg W. Mittag proporciona una serie de ejemplos interesantes en this answer a una pregunta sobre la programación Haskell del "mundo real" (con enlaces a algunas reseñas 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 Clojure; el código está disponible on GitHub. Luego está el RPG project de Brian Carper; aún no se ha publicado ningún código públicamente y solo esa publicación de hace un tiempo (se veía muy bien, así que intentemos presionar a Brian para que continúe ;-)). Finalmente, here es un ejemplo de un juego simple usando Penumbra (por alguna razón, posiblemente sin relación con Clojure, no pude hacer que funcione, pero puede que lo haga, además hay un informe adjunto).

En cuanto a las simulaciones, estudiar ants.clj es una gran idea. Además, recuerdo haber visto una serie de conferencias basadas en el SICP de un curso introductorio de programación en UC Berkeley (¿creo ...?) Disponible en algún lugar (90% fue en su canal de YouTube); ellos 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, por lo que es difícil para mí decir lo útil que podría ser para usted.

+0

¡Excelente respuesta! Mire fue divertido de leer, y el elenco Peepcode fue una buena manera de revisar las cosas (lo vi demasiado tarde, por desgracia, para obtener el buen valor de introducción que tiene). Además, Brian todavía está trabajando en el RPG, evidentemente. Emocionarse. – Isaac

+0

Michal, gracias por los útiles enlaces e información. Re. las conferencias OOP basadas en SICP, ¿quizás se refiere a las conferencias 16-18? http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/lecture-notes/ – limist

+0

@limist: No, me refería a las clases 17-19 del curso SICP de UC Berkeley; simplemente redescubrí el enlace: http://www.youtube.com/ucberkeley#g/c/6879A8466C44A5D5 @Isaac Hodes: ¡Gracias! Además, es bueno saber que Brian todavía está allí. Y gracias por su propia y genial colección de enlaces. :-) –

5

La respuesta de Michal es excelente, pero pensé en agregar algunos otros ejemplos que personalmente he encontrado útiles/interesantes.

La primera es una publicación (y un código) sobre functional fluid dynamics de Lau Jenson. Aunque definitivamente va por la ruta mutable para la velocidad aquí, el estilo es bastante funcional. Apuesto por Clojure 1.3 a que esto podría hacerse (¡la mayoría!) Inmutablemente con un rendimiento razonable.

El siguiente es un simple Snake game implementado en Clojure. Suficientemente fácil de leer en una hora más o menos, y el estilo es realmente agradable y cohesionado.

Además, un buen código para mirar (¡creo!) Es el código de modelado de redes neuronales. Jeff Foster tiene un código de perceptron single layer, y algunos más idiomatic revisions of the code. Vale la pena mirar, incluso si no está familiarizado con NN. También tiene algunos mensajes más recientes sobre dinámica de fluidos, aunque esta vez en Haskell. (Part I y Part II) También es divertido, creo, es su implementation of the Game of Life (&).

Finalmente, como mencionó Michal antes que yo, Brian Carper está trabajando en a RPG in Clojure. él recently posted some artwork para el juego, así que estoy apostando que todavía se está trabajando;)

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 prácticas y divertidas como juxt en lugar de simples iteraciones imperativas. Usted paga un impuesto, lo he descubierto, al usar Clojure/langs funcionales en la reimplementación de algoritmos imperativos bien conocidos y bien implementados.

¡Diviértete!

3

Las simulaciones son una forma de intérprete, que son fáciles de escribir en un estilo funcional. También se pueden diseñar como self-optimizing simulators, en función de tratarlos como compiladores.

+0

gracias, ¿podrían compartir más ejemplos/referencias de simulaciones como una "forma de intérprete", por favor? Soy bastante nuevo en los estilos de programación sin OO y estoy empezando a escapar de ese modo de pensar. Al final quiero escribir un DSL para la simulación en la que estoy trabajando, por lo que cualquier puntero adicional en esa dirección sería apreciado, gracias. – limist

3

Uncle Bob ha estado jugando con Clojure últimamente y en particular escribiendo un simulador orbital como su ejemplo más público.

Algunos enlaces:

4

Estoy escribiendo un juego en Clojure, usando un estilo sobre todo funcional. Por ejemplo, todo el estado del juego se modela como una estructura de datos inmutable.

Esto ha requerido una codificación algo intrincada. Por ejemplo, con frecuencia se terminan creando funciones con muchos parámetros para pasar varios elementos del estado del juego y asegurar que la aplicación de las actualizaciones del estado del juego ocurra con la última versión del juego.

Pero también ha arrojado algunas ventajas realmente agradables, por ejemplo, la simultaneidad ha resultado 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 un lenguaje para simulaciones/juegos.

Basándose en esta experiencia, las cosas que creo que mejoraría Clojure para juegos/simulaciones sería:

  • Mejor soporte para las primitivas, especialmente como parámetros de función y devolver valores
  • Implementación de funciones lingüísticas básicas que son menos duro en las asignaciones de memoria (presión GC es un problema para los juegos interactivos!)

se puede ver una primera versión del juego aquí: Ironclad - Generals of Steam. Básicamente es un juego de estrategia temático steampunk.

Cuestiones relacionadas