Em Haskell podemos definir novos tipos de dados através de declarações da forma :

<aside> 💡 data Nome p1...pn = Construtor ... | ... | Contrutor ...

</aside>

data Bool = False | True

data Maybe a = Nothing | Just a

exemplo :

data Cor = Amarelo | Verde | Vermelho | Azul
	deriving (Show) {-Acrescentar p/ visualizar os valores do novo tipo no interpretador-}
{-Definir uma função que testa se uma cor é fria-}
fria :: Cor -> Bool
fria Verde = True
fria Azul = True
fria x = False

Por nesta ordem pois o GHCi lê e testa de cima para baixo, se pusermos o "fria x = False" primeiro, todas as respostas vão ser "False" : pattern matching

Maybe a

O tipo Maybe a pode ser usado para lidar com situações de exceção.

> div 5 0
*** Exception: divide by zero
{-Para não dar erro, podemos fazer da seguinte maneira-}
myDiv :: Int -> Int -> Maybe Int
myDiv x y = if y==0
						then Nothing
						else Just (div x y)
{-Desta maneira teremos os seguintes resultado-}
> myDiv 5 0
Nothing
> myDiv 6 3
Just 2

Desta maneira, se esta função for usada em uma outro, as funções não quebraram, sem o "Maybe", quando a função "div" quebrar a outra também quebrara.

{-Outra maneira de escrever a função acima-}
myDiv x 0 = Nothing
myDiv x y = Just (div x y)

Outro exemplo : uma função para somar valores do tipo Maybe Int pode ser definida assim :

myAdd :: Maybe Int -> Maybe Int -> Maybe Int
myAdd Nothing Nothing = Nothing
myAdd Nothing (Just y) = Nothing
myAdd (Just x) Nothing = Nothing
myAdd (Just x) (Just y) = Just (x+y)

Maneira mais compacta de escrever esta equação :

myAdd :: Maybe Int -> Maybe Int -> Maybe Int
myAdd (Just x) (Just y) = Just (x+y)
myAdd **_ _** = Nothing