Seguimos con type class
Haskell tiene algunas Type Classes estándar que se definen en el Preludio estándar.Pero también podemos definir el tuyo propio.
Supongamos que estamos computando con colores. Aquí hay un tipo y un par de funciones.
data Bright = Blu | Red
deriving (Read, Show)
darkBright :: Bright -> Bool
darkBright Blue = True
darkBright Red = False
lightenBright :: Bright -> Bright
lightenBright Blue = Red
lightenBright Red = Red
Ahora, suponga que tenemos un tipo diferente que necesita funciones similares.
data Pastel = Turquoise | Tan
deriving (Read, Show)
darkPastel :: Pastel -> Bool
darkPastel Turquoise = True
darkPastel Tan = False
lightenPastel :: Pastel -> Pastel
lightenPastel Turquoise = Tan
lightenPastel Tan = Tan
Ambos tipos de colores tienen funciones para decidir si es oscuro o claro.
Podemos definir una clase Color y sus funciones correspondientes.
class Color a where
dark :: a -> Bool
lighten :: a -> a
Esto dice :
- El color es una clase de tipo
- La variable de tipo a representa un tipo particular que está en la clase Color
- Para cualquier tipo a en Color, hay dos funciones que puede usar: oscuro y claro, con los tipos especificados.
Una declaración de instancia dice que un tipo es miembro de una clase de tipo.
Cuando declaras una instancia, necesitas definir las funciones de clase.
A continuación se indica que el tipo Bright está en la clase Color y, en ese caso, la función oscura es en realidad darkBright.
instance Color Bright where
dark = darkBright
lighten = lightenBright
De manera similar, podemos declarar que Pastel está en Color, pero tiene diferentes funciones para implementar las operaciones de la clase.
instance Color Pastel where
dark = darkPastel
lighten = lightenPastel