¿Cuál sería un buen primer proyecto de programación funcional? [cerrado]

19

¿Cuál sería un buen primer proyecto de programación funcional?

Estoy buscando terminar con una explosión en mi proyecto de licenciatura y quiero terminarlo con un proyecto de programación funcional. No lo estudiamos en la escuela, pero se nos anima a tratar de aprender cosas nuevas nosotros mismos, y pensé que aprender un nuevo paradigma no solo un nuevo idioma sería un gran ejercicio para mí, y probablemente algo interesante para que los maestros también lo vean. .

El problema es que quiero comenzar un poco antes de tiempo en mi proyecto para aprovechar las vacaciones de verano y comprender mejor la programación funcional y familiarizarme con un idioma.

¿Cuál diría que sería un proyecto de buenas prácticas que es un poco desafiante, pero que también me permite aprender el lenguaje, el paradigma, etc. Y luego, ¿cuál pensaría que sería un buen proyecto (uno más avanzado) para mi proyecto de licenciatura?

También se agradecerán las sugerencias sobre el mejor lenguaje para comenzar al ingresar a la programación funcional.

Meme
fuente
1
"Qué idioma debo elegir" y las preguntas de selección de proyectos están fuera de tema aquí. Consulte las preguntas frecuentes y esta meta discusión para obtener más detalles.
Adam Lear

Respuestas:

10

En general, es más fácil si opta por algo relativamente matemático o lógico: los lenguajes de programación funcionales generalmente son adecuados para aplicaciones que representan alguna forma de transformación de una entrada dada a una salida.

Algunas ideas, en un orden aproximado de dificultad:

  • Algoritmos genéticos: escriba un programa que desarrolle soluciones para una tarea particular donde las soluciones se representan en un DSL simple. Me he divertido antes de construir pequeños bots que buscan comida en una cuadrícula 2D y desarrollan diferentes tipos de estrategias

  • Combinadores de análisis: cree una biblioteca de combinador de analizador que le permita construir un analizador para un lenguaje arbitrario utilizando funciones de orden superior.

  • Si realmente quieres un desafío, puedes intentar escribir un juego de computadora ... ten en cuenta que esta es una tarea difícil ya que los juegos tienen una gran cantidad de estado mutable que puede ser difícil de manejar en un estilo de programación funcional. Espere aprender más de lo que siempre quiso saber sobre mónadas, etc.

Recomendaría Clojure como un lenguaje funcional pragmático. Lo he estado usando durante unos 18 meses y estoy muy contento con la elección. Las razones principales son:

  • Concurrencia : Clojure tiene un sorprendente sistema STM que, en mi opinión, lo convierte en el mejor idioma del mundo en este momento para la concurrencia de múltiples núcleos. Vea el video en: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey si desea comprender por qué esto es tan especial
  • Es un Lisp , por lo que debido a la filosofía del "código es datos" es fantástico para la metaprogramación basada en macro (programas que escriben programas, algoritmos genéticos, etc.)
  • Programación funcional pragmática : el estilo Clojure es muy funcional (mucho énfasis en funciones de orden superior, secuencias perezosas, etc.) pero no es totalmente puro como Haskell. Hay muchas herramientas agradables para manejar el estado de Mtable y los efectos secundarios.
  • Dinámico : Clojure es un lenguaje dinámico por defecto. Esto me parece un gran impulso para la productividad. Sin embargo, opcionalmente puede agregar sugerencias de tipo estático más adelante si desea los beneficios de rendimiento de la escritura estática.
  • Completamente compilado : el código Clojure siempre se cumple (incluso si hace una "evaluación") para obtener un rendimiento bastante decente, ciertamente mejor que la mayoría de los lenguajes dinámicos que he usado.
  • Obtiene acceso a todas las bibliotecas y herramientas del ecosistema JVM de forma gratuita. Entonces, a diferencia de los idiomas académicos que tienen bibliotecas muy limitadas disponibles, puede acceder a cualquier cosa en el universo Java con bastante facilidad

Puede probar los conceptos básicos muy fácilmente con:

  • El conjunto de problemas en línea de 4Clojure : los primeros problemas sirven como una buena introducción de "aprender haciendo" al lenguaje Clojure
  • el Clojure REPL en línea en http://www.try-clojure.org/
mikera
fuente
Elegí tu respuesta para la pregunta porque respondió a todas mis preguntas. Muchas gracias por tomarte el tiempo.
Meme
Haskell también tiene STM; (
alternativa
@mikera: Para trabajar con la JVM, ¿has probado ABCL? Lo probé e hice solo un pequeño ejemplo, pero casi no tengo experiencia con él. (También tengo un libro Clojure en mi lista de tareas pendientes, pero esta es otra historia, tengo curiosidad si tiene alguna experiencia trabajando con ABCL y Java).
Giorgio
@Giorgio: ABCL parece ser una implementación decente de Common Lisp en la JVM. OTOH Clojure tiene las ventajas de estar diseñado para la JVM, incorporando muchas más innovaciones "modernas" y teniendo más impulso comunitario. Creo que realmente se trata de si te importa mantener la compatibilidad con Common Lisp o no.
mikera
9

Antes de comenzar a pensar en proyectos específicos, comience por aprender los conceptos básicos de la programación funcional para que pueda tener una buena idea de los tipos de proyectos que serían adecuados.

El mejor lugar para comenzar es probablemente La estructura e interpretación de los programas informáticos (SICP), que se basa en el dialecto del esquema de Lisp. Este es un texto clásico de CS, y el texto completo está disponible en línea (enlace proporcionado).

Si quieres ponerte elegante y usar un lenguaje funcional más moderno dirigido a la JVM, echa un vistazo a Clojure. Incluso hay una versión adaptada de SICP específicamente para Clojure .

Al repasar el texto del SICP, tendrá una idea de por qué la programación funcional es tan adecuada para ciertos tipos de tareas, y los ejercicios pueden inspirar un proyecto completo. Si opta por la ruta Clojure y desea examinar algunos proyectos existentes, hay algunos enlaces buenos aquí .

Jason Lewis
fuente
Gracias por proporcionar el enlace para el libro. Voy a leer eso para obtener una mejor comprensión.
Meme
¿Has leído tu SICP hoy?
MattyD
3

Análisis cuantitativo

Si considera que las finanzas son algo interesantes, hacer algunas cosas cuantiosas con la programación funcional es una buena combinación, ya que es muy algorítmico. Estoy hablando de la teoría de la cartera y cosas como las tasas de sharpe y sortino, etc. Haga una aplicación que analice los rendimientos de un fondo y proporcione diferentes estadísticas, diagramas, etc.

Recomendaría F # solo porque creo que es un lenguaje funcional fácil para comenzar, tiene buenas herramientas y un buen marco que lo respalda. Otras alternativas son lisp y clojure, pero son un poco más difíciles de aprender.

Homde
fuente
A alto nivel, es cierto que puedes hacer muchas cosas de manera funcional. Las personas han usado lenguajes funcionales para describir pagos de opciones exóticas, por ejemplo. Pero a medida que avanza al nivel del suelo, como calcular PCA, resolver ecuaciones no lineales, etc., los algoritmos se vuelven cada vez más iterativos y es mejor codificarlos a la antigua usanza.
quant_dev
1
No diría que, en mi experiencia, el análisis cuantitativo se trata de ejecutar algoritmos sobre series. Implementé cosas cuantitativas en C # y estaba muy alineado con LINQ, al menos para el tipo de cosas de la teoría de cartera
Homde
¿Qué pasa con las implementaciones de los algoritmos mismos?
quant_dev
No veo ningún problema en la mayoría de los casos, ¿verdad? Tome el cálculo de una relación de nitidez, primero calcule un rendimiento anualizado de una serie de rendimientos, luego use ese valor con una tasa libre de riesgo y volatilidad: (annualizedReturn - riskFreeRate) / volatility. Nada que un lenguaje funcional no pueda manejar
Homde
¿Qué pasa con la calibración del modelo de precios?
quant_dev
3

Para empezar, podría intentar implementar un pequeño juego de blackjack en F #. Este es un proyecto de tarea asignado durante este breve video tutorial . La solución también se proporciona en la red (y en uno de los videos).

knb
fuente
2

Podría escribir un intérprete para esquema o lisp con OCaml.

davidk01
fuente
También para notar que incluso hay un libro de Haskell sobre esto sobre el esquema de escritura en Haskell.
alternativa
2

¿En qué lenguaje funcional estabas pensando? Cada uno tiene características diferentes. El único idioma que tuvo el mayor impacto en mí fue Haskell y sugeriría que hicieras lo mismo.


fuente
Estaba pensando en F # honestamente principalmente porque en Dinamarca Microsoft todo es popular, pero cuanto más leo diferentes opiniones, dudo de esta decisión. Quiero un lenguaje que me ayude a aprender el paradigma principalmente, y después de estar seguro de que no es difícil aprender otro si lo necesito o quiero.
Meme
Depende en gran medida de dónde se encuentre y de lo que haga. Para nosotros, las tecnologías de programación de Microsoft son inútiles ya que no son compatibles con nuestra plataforma principal. Pero estoy divagando: si quieres usar F #, genial, pero luego abre una nueva pregunta específica de F #.
No quiero usar eso. Todavía no he tomado una decisión. La pregunta sobre el lenguaje a utilizar era secundaria de todos modos.
Meme
En ese caso, busque un proyecto y luego pida recomendaciones sobre cómo resolverlo. Por ejemplo, Prolog es ideal para la búsqueda del árbol de decisiones. Haskell es ideal para combinar patrones. Lisp es ideal para construir y manipular programas Lisp en tiempo de ejecución dependiendo de sus datos.
0

También podría contribuir a algún proyecto de código abierto.

Por ejemplo, en el proyecto de lenguaje de programación Frege , hay mucho trabajo por hacer. Por ejemplo, podría importar portar bibliotecas Haskell base. Esto te haría una especie de experto en Haskell mientras trabajas en ello.

Ingo
fuente