Translate

domingo, 1 de noviembre de 2020

Tipos con Clase parte 2


Seguimos con type class

Un Type Class es un conjunto de tipos para los que se definen algunas operaciones.

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