Práctico Haskell 3: MultiParamTypeClasses, FunctionalDependencies, TypeFamilies

La multi-clase Collection

Hacer este ejercicio en un archivo Multi.hs. Será muy probable necesario agregar al principio del archivo unas pragmas para artivar extensiones del lenguaje. Esas pragmas tienen la forma:

{-# LANGUAGE NombreExtension #-}

Consideremos la multi-clase Collection (no contiene la función empty a propósito):

class Eq e => Collection c e where
    insert :: c -> e -> c
    member :: c -> e -> Bool

instance Eq a => Collection [a] a where
    insert xs x = x:xs
    member = flip elem

Agregar una instancia Collection (Set a) a.

import qualified Data.Set as S

Documentación del módulo: https://hackage.haskell.org/package/containers

Probar en GHCi lo siguiente:

esFalso = member ( insert (S.empty :: S.Set Int) (1 :: Int) ) ( 2:: Int)

Como la clase no provee empty ponemos la constante S.empty.

¡Diversión con las dependencias funcionales!

En este ejercicio usamos el artículo “Fun with Functional Dependencies” de Thomas Hallgreen:

http://www.cse.chalmers.se/~hallgren/Papers/wm01.html

La idea es adaptar el código del artículo en un módulo que pueda ser usado por GHCi. A continuación algunas preguntas y observaciones para hacer la lectura más progresiva.

Secciones 1 hasta 3.2.1 incluido

¿Porqué es necesario incluir las funciones isEven e isOdd en las clases Even y Odd?

Sección 3.2.2

Dibujá los tipos y clases de tipos de esta sección al estilo diagrama de Venn..

Sección 3.2.3

Por primera vez vemos 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.

Sección 3.3

Podés saltar esta sección, lo más interesante viene después.

Sección 3.4

Esta sección es tal vez la más interesante, pero también la más difícil. Si viste algo de Prolog, el ejemplo te va a traer recuerdos.

Cuidado que esta sección contiene (¿a propósito?) errores en el código, deberás pensar un poco para arreglarlos. Además no es necesario dar constructores para los tipos Nil y Cons.

Para comprobar las definiciones, usar los tests siguientes:

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

Más diversion con las dependencias funcionales

En el mismo estilo que el ejercicio anterior, está el artículo “Type-level Instant Insanity”, un poco más reciente (del 2007).