Um padrão é uma variável, uma constante, ou um construtor aplicado a outros padrões (isto é, um “esquema” de um valor atómico de um determinado tipo)
Em Haskell, um padrão não pode ter variáveis repetidas (são padrões lineares)
distOrigem :: PontoC -> Float
distOrigem (PC (x,y) c) = sqrt (x^2+y^2)
{-(PC (x,y) c) é um padrão do tipo PontoC-}
Ao definir funções colocamos como argumento um padrão do tipo do domínio da função.
Quando a função é aplicada, o padrão que está no argumento da função é instanciado com o valor concreto, através de um mecanismo chamado de pattern matching (concordância de padrões) e as várias variáveis que compõem o padrão recebem um valor concreto.
> distOrigem (PC (2.5,3) Azul)
3.905125
o pattern matching é bem sucedido e x=2.5, y=3 e c=Azul
O mecanismo de pattern matching permite que possamos definir a mesma função de diferentes modos. Por exemplo :
distOrigem :: PontoC -> Float
distOrigem (PC p c) = distancia p (0,0)
{-(PC p c) é um padrão do tipo PontoC, sendo p um padrão do tipo Coordenada e c um-}
{-padrão do tipo Cor.-}