Maratona de Haskell - Sexto Dia

Fala pessoal!

Ontem nós entendemos como tipos funcionam em Haskell, quais os tipos que Haskell suporta e que nós temos tipos variáveis que podem nos ajudar bastante. Hoje vamos falar sobre type classes. Primeiro de tudo temos que dizer que type classes não são classes. Com este aviso nós podemos ir em frente e descobrir o que diabos são type classes.

Type class não é mais que uma interface que descreve alguns comportamentos. Se um tipo é uma instância de uma type class, então ele implementa seus comportamentos. Para ser mais claro, type class é somente uma coleção de funções que decidimos que fazem sentido para um tipo. As mais comuns type classes em Haskell são Eq, Ord, Show, Read, Enum, Bounded, Num, Floating e Integral. Vamos dar uma rápida resumida neles.


Eq type class

Primeiro vamos validar o tipo do operador == que é uma instância de Eq.

:t (==)
(==) :: Eq a => a -> a -> Bool

Como nós já sabemos o :t retorna o tipo de um valor ou função. O operador == é uma função e nós podemos ver seus tipos. Nós já aprendemos como le-los. A função recebe dois tipos variáveis chamados “a” e retorna um Bool. Mas espere um minuto, que diabos é Eq a =>? Eq a => quer dizer que o tipo “a” deve ser uma instância da classe Eq. As instâncias de Eq implementam duas funções que são == e /=.


Ord type class

Ord é um type class para tipos cujo os valores podem ser ordenados. Vamos dar uma olhada em um operador para o type class Ord.

:t (<)
(<) :: Ord a => a -> a -> Bool
5 < 6
True
5 < 4
False

O tipo < é similar a == qual nós vimos anteriormente. Todos os tipos que cobrimos anteriormente são instâncias de Ord, somente as funções não são. Os operadores de Ord são <, <=, > e >=.


Show type class

Tipos que são instâncias de do type class Show podem ser representados por strings. Como Ord, todos os tipos que foram cobertos são instâncias do type class Show, somente as funções que não. O comportamento do type class Show é printar valores.

show 5
"5"
show 'a'
"'a'"
show True
"True"


Read type class

O comportamento do type class Read é o oposto do comportamento do type class Show, mas todo o resto é o mesmo. Ele lê uma string e transforma em valor.

read "True" || False
True
read "True" && False
False
read "5" + 4
9
read "['a']" ++ ['h']
"ah"


Enum type class

O type class Enum tem o comportamento de montar sequências. Então toda as instâncias de Enum são tipos sequencialmente ordenados e valores podem ser enumerados. Essas instâncias podem ser usadas em intervalo de listas e possuem sucessor e predecessor.

['a'..'f']
"Abcdef"
[3..9]
[3,4,5,6,7,8,9]


Num type class

Num é um type class numérico. Suas instâncias podem atuar como números.

:t 5
5 :: Num a => a
5 :: Int
5
5 :: Integer
5
5 :: Float
5.0
5 :: Double
5.0


Floating type class

O type class Floating tem instâncias do tipo Float e Double. As funções que são instâncias do type class Floating devem representar pontos flutuantes.

sin 2
0.9092974268256817
cos 2
-0.4161468365471424


Integral type class

O type class Integral é outro type class numérico que inclue Int e Integer.


Um tipo pode ser instância de multiplos type classes. Temos que pensar, que como uma interface, cada type class possue comportamentos que devem ser seguidos. Por exemplo, um tipo pode ser uma instância do type class Eq e do type class Ord e ter igualdade e ordenação como comportamentos.
Parece que type classes não são muito útils para nós agora, mas em itens mais complexos do Haskell esse conhecimento vai nos ajudar.

Written on December 6, 2016