Num - (+) :: Num a => a -> a -> a
Classe dos tipos numéricos (tipos sobre os quais estejam definidas operações como a soma e a multiplicação)
Eq - (==) :: Eq a => a -> a -> Bool
Classe dos tipos que têm o teste de igualdade definido
Ord - (<) :: Ord a => a -> a -> Bool
Classe dos tipos que têm uma relação de ordem definida sobre os seus elementos
> elem 3 [1,2,3,4,5]
True
> elem 7 [1,2,3,4,5]
False
> max 35 28
35
> max 5.6 10.7
10.7
elem :: Eq a => a -> [a] -> Bool ⇒ Porque se usa a função (==) na sua implementação
max :: Ord a => a -> a -> a ⇒ Porque se usa a função (<) na sua implementação
As classes são uma forma de classificar tipos quanto às funcionalidades que lhe estão associadas.
Uma classe estabelece um conjunto de assinaturas de funções.
Os tipos que são declarados como instâncias dessa classe têm que ter essas funções definidas.
Exemplo :
Exemplo: A declaração (simplificada) da classe ***Num*
class** Num a **where**
(+) :: a -> a -> a
(*) :: a -> a -> a
exige que todo o tipo a da classe *Num* tenha que ter as funções (+) e (*) definidas
Para declarar Int e Float como pertencendo à classe Num, tem que se fazer as seguintes declarações de instância.
**instance** Num Int **where**
(+) = primPlusInt
(*) = primMulInt
**instance** Num Float **where**
(+) = primPlusFloat
(*) = primMulFloat