title | author |
---|---|
Laboratorio de Funcional |
Tomás Achával, Tomás Maraschio, Tomás Peyronel |
La consigna del laboratorio está en https://tinyurl.com/funcional-2024-famaf
Pueden usar esta checklist para indicar el avance.
- Haskell instalado y testeos provistos funcionando. (En Install.md están las instrucciones para instalar.)
- Módulo
Dibujo.hs
con el tipoDibujo
y combinadores. Puntos 1 a 3 de la consigna. - Definición de funciones (esquemas) para la manipulación de dibujos.
- Módulo
Pred.hs
. Punto extra si definen predicados para transformaciones innecesarias (por ejemplo, espejar dos veces es la identidad).
- Módulo
Interp.hs
.
- El dibujo de
Dibujos/Feo.hs
se ve lindo. - Módulo
Dibujos/Grilla.hs
. - Módulo
Dibujos/Escher.hs
. - Listado de dibujos en
Main.hs
.
- Tests para
Dibujo.hs
. - Tests para
Pred.hs
.
Hacer el laboratorio fue una buena experiencia, nos hizo recordar Haskell (incluso aprender más) y también tuvo algunas dificultades que supimos enfrentar. La checklist fue útil para trabajar paso a paso.
Está bueno hacer programas que tengan un output visual, de esta forma es más entretenido y da lugar a algo más de creatividad. Fue interesante aprender sobre Gloss, y su documentación, simple pero completa, fue muy útil.
Algunas observaciones y sugerencias desde nuestro punto de vista:
- Quizás la explicación en comentarios de algunas funciones como foldDib nos pareció insuficiente (por ej, ¿Qué representa cada argumento?).
- El módulo definido en Pred.hs nos resultó poco útil por fuera de los tests, quizás algun punto más en la consigna podría dar lugar a su utilización.
- El código del kickstart no coincidía al 100% con el del enunciado, por lo tanto algunas partes se volvieron confusas.
¿Por qué están separadas las funcionalidades en los módulos indicados? Explicar detalladamente la responsabilidad de cada módulo.
Las funcionalidades están separadas en módulos para poder abstraernos de sus implementaciones, y cada uno de estos módulos se encarga de solucionar un problema especifico:
Módulo Dibujo: Contiene la declaracion de nuestro DSL y todo lo relacionado a armar y transformar dibujos como tipo/estructura de datos.
Módulo FloatingPic: Contiene funciones básicas sobre vectores y las definiciones de los tipos FloatingPic (una imagen de un tamaño especificado a renderizar en coordenadas especificadas) y Output (Utilizado como función que convierte un dibujo en una FloatingPic).
Módulo Interp: Se encarga de interpretar los dibujos y sus transformaciones, ajustando sus coordenadas y tamaños.
Módulo Pred: Funciones booleanas sobre dibujos.
Módulo Main: Se encarga de correr el programa, permitiendonos seleccionar un dibujo para mostrarlo en pantalla.
¿Por qué las figuras básicas no están incluidas en la definición del lenguaje, y en vez de eso, es un parámetro del tipo?
Las figuras básicas son un parámetro del tipo Dibujo por razones de polimorfismo => poder crear Dibujos de cualquier tipo de figura básica utilizando la misma estructura y formato. Más aún, ¡podemos transformar un Dibujo de un tipo de figura básica a otro!
Utilizar la función foldDib nos permite ignorar la implementación interna de los Dibujos (por lo tanto, sus constructores podrian cambiar de nombre sin problemas) y, con un solo llamado, generar una cadena compuesta de funciones a aplicar sobre sus figuras.
En Pred.hs están definidas funciones que se usan para definir predicados, mientras que en los tests definimos algunos predicados que queremos que sean ciertos en base a las funciones definidas en Pred.hs.
Para implementar interpBas FishHD en Escher.hs, primero dibujamos un SVG en un editor vectorial. Luego, creamos un script que convierte un SVG con curvas a una serie de secuencias de puntos.