Programación Funcional para Economistas

Dada mi mención de programación funcional en mi entrada anterior, un amable lector me recuerda el famoso curso de MIT, Structure and Interpretation of Computer Programs. Aquí están los videos de una versión de este curso. Y aquí la versión electrónica del libro de Harold Abelson y Gerald Jay Sussman con Julie Sussman, un auténtico clásico. En el doctorado en Minnesota, al menos cuando yo estuve, lo empleaban muchos estudiantes para aprender programación a un nivel un poco más avanzado.

El curso emplea Lisp/Scheme, creado originalmente por John McCarthy, quizás décadas antes de su tiempo. Lisp ha tenido un renacimiento recientemente como Clojure. Clojure tiene la enorme ventaja de emplear la Java Virtual Machine, con lo que es muy facil integrarlo con entornos en Java.

Sobre Clojure he leido este libro y este otro para un proyecto que estoy a punto de terminar, pero no me he familiarizado en exceso con el lenguaje por su baja velocidad media de ejecución, que en mi caso personal es una restricción muy relevante.

Por supuesto, la linea más pura de programación funcional emplea Haskell (en Penn Computer Science hay mucha gente que lo utiliza), pero en mi experiencia es que para la mayoría de los economistas no es el camino a seguir. Otra posibilidad, menos radical, es irse con Scala (una clase en Coursera por Martin Odersky, el creador del lenguaje, y su libro) o con F# (este libro creo que es pedagógico).

Como comentaba en la respuesta a una pregunta en mi anterior entrada, mi evaluación de la situación que para muchos economistas quizás sea una mejor solución incorporar las lecciones de la programación funcional en parte de sus códigos en C++14, Python (este libro acaba de salir) o incluso en Matlab (esto por supuesto puede ser muy diferente en otras areas o en el mundo privado). R también te deja hacer muchas cositas con clausuras. Por ejemplo, hoy mismo en R-bloggers sale esta entrada y Hadley Wickham ha escrito mucho sobre el tema.

Estoy a punto de terminar un documento de trabajo donde explicaré muchas de estas cosas pero, para abrir el apetito, cierro esta entrada con unos cuantos videos. Primero, Neal Ford, el autor del libro que recomendaba ayer:

y un extracto de su curso (el curso completo se puede comprar aquí)

Otra introducción:

y una buena descripcion de las mónadas, como a mitad del video:

Una introducción a la programación funcional en C++:

Una introducción en Python:

Una introducción en Java:

Y algo de visión contraria, para aclarar que nada es gratis, especialmente cuando uno escribe código:

Hay 10 comentarios
  • Me preguntan sobre los beneficios de programacion funcional para un economista. En los videos hay muchos argumentos sobre las ventajas del paradigma en general (mas facil de encontrar bugs, codigo limpio y elegante, etc.) pero en concreto para nosotros:

    1) La manera de escribir ecuaciones en general en matematicas y en codigo procedural u O-O es tremendamente distinta, lo cual genera mil dificultades. En cambio, escribir codigo funcional permite una relacion muy directa entre las ecuaciones en el papel y ecuaciones en el codigo, lo cual no solo incrementa la productividad, sino que permite pensar acerca del problema de una manera mucho mas refinada.

    2) Cuando usas programacion con paralelismo masivo los problemas de concurrencia con los que te encuentras sino empleas programacion funcional son casi insalvables. Yo mismo los he experimentado de manera brutal en varios papers recientes. En cuanto mis coautores y yo nos cambiamos a un enfoque mas funcional empezo todo a ir mucho mejor.

    3) Muchisimos problemas en econometria se solucionan de manera mas sencilla en un paradigma funcional. El libro de Hadley Wickham que menciono en el texto tiene muchos ejemplos.

  • Gracias por tus post, siempre se aprende algo nuevo.
    Que recomendarías aprender un estudiante en el primer año de doctorado, que no tiene ni idea de programación en general?
    Tengo nivel alto de Stata, y tenía pensado empezar a a prender Matlab, pero no se si hay opciones más interesantes.
    Muchas gracias y un saludo!
    Pd: Se echan de menos posts al estilo de la triología sobre Niall Fergusson, y de historia económica en general =)

    • Matlab no esta mal para aprender. Si tienes acceso a licencia academica te permite hacer muchas cosas. El lenguaje empieza a demostrar sus años y en algunos sitios chirria bastante, pero es una buena manera de aprender.

      A los estudiantes de primero en Penn les suelo recomendar:

      Matlab, Third Edition: A Practical Introduction to Programming and Problem Solving, de Stormy Attaway.

      Stata: No! Pasate a R. Gratis, mucho mas poderoso 😉 RStudio es un IDE fenomenal. Mira

      The Art of R Programming: A Tour of Statistical Software Design, de Norman Matloff

      o quizas,

      R in Action, de Robert Kabacoff.

      De hecho, si te bajas el libro de Matloff, R y RStudio (R y RStudio son gratis y el libro de Matloff son 17 dolares en Kindle en EEUU), puedes empezar a programar muchas cosas sin necesidad de tener Matlab a mano (aunque R es mas lento que Matlab). Las ideas principales de programacion son las mismas.

      Temas de historia economica: si, si, ya volvere. Curiosamente he escrito mucho para un libro en preparacion ultimamente de historia economica y quizas por ello escribo menos el blog del tema, para cambiar un poco de aires yo mismo.

        • Es verdad que Octave es un clon de Matlab de codigo abierto.

          Pero es tambien verdad que Octave es MUCHO mas lento que Matlab:

          http://thatcadguy.blogspot.com/2011/01/mathworks-matlab-vs-gnu-octave.html

          Podria entrar en los detalles de esta diferencia de velocidad (basicamente Matlab tiene un JIT escondido) pero esto es un comentario corto.

          Si alguien esta en una universidad con acceso a licencia academica a un precio razonable, yo no recomendaria emplear Octave

          • ¡Ahora me acaban de entrar ganas de hacer carreras de programas a ver cuál va más rápido (¿será Octave mejor en optimización?¿Cuánto mejor es Matlab haciendo análisis de series temporales?)!

            Eso me pasa por leer... 🙂

  • Jesús ... Muchas gracias por tus posts ... si hubiera más "empollones" como tú, nos iría mejor en este país, pero eso requiere tiempo y, sobre todo, requiere aumentar el nivel de conocimiento de esta sociedad ... tu caso tiene aún más mérito, pues no debe ser fácil discutir con pasión sobre si la Programación Funcional es mejor con Python, Java, o Scala ... que si es bueno, o no, que se puedan modificar las estructuras de datos, etc. ... partiendo de tu licenciatura en Derecho (por mi parte, creo que fue más fácil: pasé de Teleco a la Econometría, programando en PL/1 series de Box-Jenkins).

    Por último, he visto parte de algunos vídeos y me recordó mi época de trabajo en USA. Los americanos tienen mucho que mejorar en sus servicios públicos, en su nivel de cultura medio de la población, etc. ... pero no se les puede negar su capacidad de ser MUY eficientes, creo que esa es la principal razón por la que mantienen su liderazgo mundial. Espero que tu compañero @lugaricano sea capaz de transmitir este mensaje al resto del personal, en su nueva aventura política.

    Saludos.

  • También cabe mencionar O'Caml, menos purista que Haskell y más sucinto que C++, algunos lo han usado para evitar las dificultades de ambos extremos. Aunque con muy buen rendimiento, su garbage collector imponía limitaciones a la paralelización. Ignoro si ha sido resuelto.

    Si lo que se quiere es tener muy controlado los detalles de implementación y rendimiento, es difícil evitar el C++. En el futuro algo como Rust tal vez sea una alternativa en ese campo.
    http://science.raphael.poss.name/rust-for-functional-programmers.html

    En todo caso lo idóneo es separar los algoritmos de los detalles de implementación. El aumento de la complejidad de las arquitecturas (concurrencia, caché, etc.) juegan a la contra cada vez más de las soluciones de alto rendimiento ad hoc. Un ejemplo interesante de desarrollo en esa línea es la librería Halide:
    http://halide-lang.org

    Como curiosidad histórica pongo aquí el paper original de John McCarthy sobre el Lisp (de 1959):
    ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-008.pdf

    • Gracias por mencionar OCaml. No lo mencione por no alargar en exceso la entrada.

      No conocioa Halide. Ahora la miro.

Los comentarios están cerrados.