Programación Funcional Avanzada (CI-4251)

Este es un curso electivo libro del área de Lenguajes de Programación que se ofrece una vez al año en el trimestre Abril-Julio. Como se trata de una electiva libre, supongo que Ud. está interesado en el tema, así que no se trata de «pasar» sino de ver cuán dedicado e interesado está en el tema, y la calidad del trabajo resultante. Por lo tanto, a menos que Ud. no haga absolutamente nada durante el trimestre, seguramente aprobará la asignatura con tres (3) si cumple con las tareas. Alcanzar el cuatro (4) o el cinco (5) dependerá de producir programas de maneras creativas y con desempeño notable.

Herramientas de Programación

Usaremos el lenguaje de programación Haskell para desarrollar las soluciones a las tareas propuestas. Dependiendo de la audiencia y el avance del curso, se estudiará Erlang para el nicho específico de programación concurrente distribuida.

Haskell

Debe trabajarse con GHC 7.6 o 7.8, el entorno interactivo del Glasgow Haskell Compiler.

Para instalarlo:

  • En Debian GNU/Linux 8 (Jessie) y en Ubuntu reciente, pueden instalar todo lo necesario haciendo

    aptitude install haskell-platform
    

    Otras distribuciones Linux podrían tener un paquete razonable — consulte la documentación de la distribución.

  • Para MacOSX o Windows, visiten la página de descargas

  • Bajo ninguna circunstancia usen GHC 8.0, Hugs ni NHC.

Todos los archivos que formen parte de su proyecto deben estar completa y correctamente documentados (los errores ortográficos son inaceptables y serán penalizados) utilizando «Literate Haskell»:

  • El programa se entrega como un archivo .lhs que incluye el código Haskell combinado con el texto e instrucciones LaTeX para formato.

  • El archivo tiene que poder cargarse en ghci o compilarse con ghc --make sin inconvenientes.

  • El archivo tiene que poder ser procesado con

    pdflatex solucion.lhs
    

    para generar un archivo PDF en el cual leer la descripción de la solución junto con el código fuente. Si usa Debian 8 o un Ubuntu reciente, la generación a PDF depende de los paquetes

    aptitude install texlive-latex-base texlive-latex-extra pgf
    
  • Los errores ortográficos y el «va sin acentos» son inaceptables y serán penalizados.

Si alguna de las tareas incluye la construcción de uno o más módulos, estos deben estar completa y correctamente documentados usando Haddock:

  • Descripción del módulo identificando propósito, materia, grupo y entrega.

  • Descripción de todos los nombres exportados por el módulo.

  • Descripción funcional (qué hace) de cada función exportada, incluyendo la descripción semántica (qué representa) cada argumento y el valor resultante de la función.

  • Para funciones complejas, es conveniente que agregue una descripción operativa (cómo lo hace) como un comentario interno en el código fuente.

La documentación de Haddock abunda en detalles acerca de las marcas a utilizar para lograr estos resultados.

La evaluación de sus proyectos tomará en cuenta el uso correcto del estilo funcional, el aprovechamiento de las librerías del lenguaje (no reimplantar cosas que existen), y la eficiencia algorítmica. No basta «que funcione»; tiene que ser eficiente.

Tareas

Las tareas son individuales. Habrá seis o siete tareas a lo largo del trimestre.

Si encuentran en biblioteca, hemeroteca o Internet un artículo, fragmento o aplicación que resuelva total o parcialmente sus proyectos, es válido utilizarlo siempre y cuando cumpla con dos condiciones simultáneamente:

  • Cite completa y correctamente el origen del trabajo (dónde lo encontró y quién lo escribió originalmente).

  • Prepárese a explicarlo completamente en revisión personal.

Resolver problemas apoyándose en soluciones de otros es perfectamente válido, siempre y cuando se tenga el coraje académico de reconocerlo.

Cronograma Habitual y Material de Apoyo

Sigue el cronograma habitual del curso. El orden de las primeras doce sesiones siempre es el mismo. El resto de las sesiones puede variar dependiendo de los intereses del grupo y de los cambios en la tecnología.

Las versiones de cursos anteriores no están disponibles. Si durante alguna clase se hacen correcciones o agregados, espere encontrar la versión corregida aquí eventualmente.

El material de apoyo consiste en fragmentos de código presentado en clase. La mayoría de los ejemplos en las láminas no están provistos, con la intención de que tenga que escribirlos para experimentar por su cuenta.

Láminas de Clase

Programas de Ejemplo

Ediciones Anteriores