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.-}