Página de Guillaume Hoffmann

View on GitHub

% Práctico Haskell 8: Clases múltiples y dependencias funcionales

Este ejercicio viene del artículo “Fun with Functional Dependencies” de Thomas Hallgreen.

Hacé este ejercicio en el módulo FunDeps.hs.

¡Fijate que estamos definiendo tipos sin constructores! No es un problema porque justamente vamos a programar al nivel de los tipos.

Entender y probar el código existente

El código del módulo FunDeps.hs es de la sección 3.2.2 del artículo (“Functions”).

Probá cada línea siguiente en GHCi, una por una:

:type odd  (undefined :: Three)
:type even (undefined :: Three)

En el primer ejemplo, preguntamos con qué tipo está relacionado Three a través de la relación Odd, y GHCi contesta que True.

En el segundo ejemplo, preguntamos de la misma manera si Three está relaciondo con Even, y GHCi contesta False.

En la sección 3.2.2 del artículo se presentan las clases múltiples Add y Mul que codifican la suma y el producto al nivel de los tipos.

Son clases que definen relaciones entre 3 tipos. La anotación a b -> c significa que el tipo de a y de b (en este orden) implica el tipo de c.

:type add (u::Three) (u::Three)
:type mul (u::Three) (u::Three)

No hace falta leer ni implementar la sección 3.3 del artículo.

Completar el módulo FunDeps

  1. Leé la Sección 3.4 del artículo “Fun with Functional Dependencies”
  2. Definí los tipos nuevos (Nil, Cons) y las clases nuevas de esta sección (DownFrom, Lte, Insert, InsertCons, Sort)

Cuidado que esta sección contiene errores en el código, deberás arreglarlos.

No es necesario dar constructores para los tipos Nil y Cons.

Para comprobar las definiciones, usá los comandos GHCi siguientes:

:t downfrom (u :: Three)
:t insert (u :: Succ Zero) (u :: Cons Zero Nil)
:t sort (downfrom (u :: Three))