Haskell (linguagem de programação)

Keywords: Haskell (linguagem de programação), 1980, Casamento de padrões, Fatorial, Glasgow, MIT, Open source, Programação, Quicksort, Seqüência de Fibonacci

Na década de 1980, um comitê foi organizado com o objetivo de construir uma linguagem funcional de programação padronizada com uma semântica não-rígida. Haskell, em homenagem ao lógico Haskell Curry, foi o resultado dessas deliberações. O último semi-oficial padrão desta linguaguem é Haskell 98, destinado a especificar uma versão mínima e portável da linguagem para o ensino e como base para futuras extensões. A linguagem continua a evoluir rapidamente, com Hugs e GHC (veja abaixo) representando os padrões atuais 'de fato'.

Características interessantes do Haskell incluem o suporte a funções recursivas e tipos de dados, casamento de padrões, list comprehensions e guard statements. A combinação destas características pode fazer com que a construção de funções que seriam complexas em uma linguagem procedimental de programação tornem-se uma tarefa quase trivial em Haskell. A linguagem é, em 2002, a linguagem funcional sobre a qual mais pesquisa está sendo realizada. Muitas variantes tem sido desenvolvidas: versões paralelizáveis do MIT e Glasgow, ambas chamadas Parallel Haskell, outras versões paralelas e distribuidas chamadas Distributed Haskell (anteriormente Goffin) e Eden, uma versão chamada Eager Haskell e várias versões orientadas a objetos: Haskell++, O'Haskell e Mondrian.

Uma versão educacional do Haskell chamada Gofer foi desenvolvida por Mark Jones. Ela é oferecida por HUGS, o Haskell User's Gofer System (veja a seção de implementações deste artigo).

Exemplos

A clássica definição da função fatorial:

fatorial 0 = 1
 fatorial n = n * fatorial (n - 1)
 

Uma bela definição da função fatorial (usando uma notação de lista em Haskell e a função padrão product):

fatorial n = product [1..n]
 

Uma implementação da função que retorna o n-ésimo termo na seqüência de Fibonacci:

fib 0 = 0 
 fib 1 = 1 
 fib n = fib (n - 2) + fib (n - 1)
 

Uma função que retorna uma lista dos números de Fibonacci:

fibs@(_:rest) = 0 : 1 : (zipWith (+) fibs rest)
 

A função anterior cria uma lista infinita, que é possível graças a lazy evaluation. Poderia-se implementar fib como:

fib n = fibs !! n
 

(!! é um operador que pega o n-ésimo elemento da lista).

O algoritmo Quicksort podem ser elegantemente escrito em Haskell:

qsort []    = []
 qsort (x:xs) =
   qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
   where
     elts_lt_x   = [y | y <- xs, y < x]
     elts_greq_x = [y | y <- xs, y >= x]
 

(Note que por causa das excessivas cópias e concatenações de listas este código pode ser um tanto lento, dependendo da implementação.)

Implementações

As seguintes estão totalmente, ou quase, de acordo com o padrão Haskell 98 e são destribuídas sob licenças open source ou free software. Existem atualmente somente implementações não-comerciais do Haskell.

Links externos

Keywords: Haskell (linguagem de programação), 1980, Casamento de padrões, Fatorial, Glasgow, MIT, Open source, Programação, Quicksort, Seqüência de Fibonacci