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:
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
.
Documentación del módulo: https://hackage.haskell.org/package/containers
Probar en GHCi lo siguiente:
Como la clase no provee empty
ponemos la constante S.empty
.
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.
¿Porqué es necesario incluir las funciones isEven
e isOdd
en las clases Even
y Odd
?
Dibujá los tipos y clases de tipos de esta sección al estilo diagrama de Venn..
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
.
Podés saltar esta sección, lo más interesante viene después.
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))
En el mismo estilo que el ejercicio anterior, está el artículo “Type-level Instant Insanity”, un poco más reciente (del 2007).