sexta-feira, 20 de junho de 2014

Mais Polimorfismo (Haskell)

Fala galera, tudo tranquilo?

Bom, hoje vou levantar um dos assuntos que mais falo a respeito no Blog: Polimorfismo. Mas vamos estudar um pouco disso no Haskell. Certo?

Haskell incorpora alguns tipos polimórficos, as expressões de tipos polimórficos, na essência, descrevem famílias de tipos. Por exemplo, uma lista de caracteres ['h', 'a', 's', 'k', 'e', 'l', 'l'] , uma lista de inteiros [1,1,2,3,5,8] e podemos chegar até na lista de lista de caracteres [['a'], ['b'], ['c']], ou seja, todas essas listas compartilham da mesma família de tipos. Mas, no Haskell, temos uma pequena restrição, uma lista que foi determinada para ser usada com Inteiros, não pode receber um caracter. (Ex.: [1, 'b'])

Ao definirmos uma função que utiliza tipos polimórficos, definimos uma função genérica. Como exemplo abaixo:
   length [] = 0
   length (a:x) = 1 + length x 

Com essa função podemos ver claramente que independente do tipo de dado que for utilizado, conseguiremos usa-lo como parametro para a função que calcula o tamanho da lista. E você sabe dizer qual o retorno da função acima?
 Prelude> :t length
          length :: [a] -> Int

O a é uma variável do tipo polimórfica. A função length é uma função genérica.

O sistema de tipos Haskell possui duas propriedades: - Toda expressão bem tipada é garantida por ter um único tipo genérico. - O tipo genérico ou mais geral pode ser inferido automaticamente.

Lembrando que, no Haskell temos uma linda type inference(Inferência de tipos), mesmo que você possa definir o tipo de uma função, o Haskell o faz:
    soma :: Int -> Int -> Int
    soma x y = x + y

No entanto a função acima pode ser escrita somente pela segunda linha, usando assim o type inference do Haskell.

Por hoje é só, escrevi esse post porque acordei cedo e estava sem sono rs. No próximo, vou falar do Polimorfismo ad hoc.

Abraços!