TADs
Los tipos abstractos constan de una estructura de datos y unas operaciones para acceder a estos datos. Los módulos en Haskell, como anteriormente hemos visto, proporcionan la propiedad de ocultar los detalles de implementación dando múltiples opciones sobre como queremos que se exporten las funciones.
En Haskell se hace la distinción de TADs con interfaz no sobrecargada y sobrecargada. Que la interfaz sea sobrecargada quiere decir que puedan existir varias implementaciones de un mismo tipo abstracto de datos sin tener que recurrir a importación cualificada.
Las siguientes figuras muestran un ejemplo de TADs con interfaz no sobrecargada y sobrecarcada respectivamente:
La diferencia fundamental está en que, en el interfaz no sobrecargado la propia estructura de datos esta dentro del módulo, por tanto, ha de usarse la misma estructura de datos en cualquier implementación. En cambio, en el interfaz sobrecargado recurrimos a una clase que contenga las declaraciones del ilnterfaz para, posteriormente, realizar distintas implementaciones a través de intancias concretas de esa clase.
Vease además, que la clase que contiene los constructores exporta completamente todas sus entidades y que la implementación de cola con interfaz sobrecargado se hace a traves de instancias concretas de la clase que hemos definido.