Haskell é uma linguagem de programação puramente funcional, de propósito geral, nomeada em homenagem ao lógico Haskell Curry. Como uma linguagem funcional, a estrutura de controle primária é a função; a linguagem é baseada nas observações de Haskell Curry, with 2 sections by William Craig, see paragraph 9E e seus descendentes intelectuais.De Bruijn, Nicolaas (1968), Automath, a language for mathematics, Department of Mathematics, Eindhoven University of Technology, TH-report 68-WSK-05. Reprinted in revised form, with two pages commentary, in: Automation and Reasoning, vol 2, Classical papers on computational logic 1967-1970, Springer Verlag, 1983, pp. 159-200.. Seu último padrão semi-oficial é o 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.

Haskell é a linguagem funcional sobre a qual mais se realizam pesquisas atualmente. Muito utilizada no meio acadêmico, ė uma linguagem relativamente nova, derivada de outras linguagens funcionais, como por exemplo Miranda e ML. Ela se baseia em um estilo de programação em que se enfatiza mais o que deve ser feito (what) em detrimento de como deve ser feito (how). É uma linguagem que possui foco no alcance de soluções para problemas matemáticos, clareza, e de fácil manutenção nos códigos, e possui uma variedade de aplicações e apesar de simples é muito poderosa.

História O conceito de avaliação preguiçosa já estava difundido no meio acadêmico desde o final da década de 1970. Esforços nessa área incluíam técnicas de redução de grafo e a possibilidade de uma mudança radical na arquitetura de von Neumann.Hudak 2007, p. 2 Após o lançamento de Miranda em 1985, diversas outras linguagens funcionais de semântica não rígida proliferaram, como Lazy ML, Orwell, Alfl, Id, Clean, Ponder e Daisy (um dialeto de Lisp). Mesmo após dois anos, Miranda ainda era a mais usada, mas não estava em domínio público.

Em setembro 1987 foi realizada uma conferência Functional Programming Languages and Computer Architecture (FPCA '87), no Oregon. O consenso foi a criação de um comitê com o objetivo de construir um padrão aberto para tais linguagens.Hudak 2007, p. 3 Isso consolidaria as linguagens existentes, servindo como base para pesquisas futuras no desenvolvimento de linguagens. A primeira reunião do comitê foi realizada em janeiro de 1988, e algumas das metas da linguagem foram discutidas. A linguagem deveria ser de fácil ensino, deveria ser completamente descrita através de uma sintaxe e semântica formal, deveria estar disponível livremente. Haskell foi criada da necessidade de unir as outras linguagens do mesmo paradigma em uma só.

Dentre os principais objetivos deste comitê, ao projetar essa nova linguagem, estavam suas especificações: Ser viável para o ensino, pesquisa e aplicações, incluindo sistema de larga escala; Ser completamente descritiva via publicação no tocante à sua sintaxe e sua semântica; Não ser proprietária, tal que qualquer um pudesse implementá-la e distribuí-la; Basear-se em ideias que envolvessem o senso comum; Reduzir a diversidade desnecessária de outras linguagens funcionais.

A primeira versão de Haskell foi definida em 1 de abril de 1990. Seguiu-se a versão 1.1 em agosto do ano seguinte, a versão 1.2 em março de 1992, a versão 1.3 em maio de 1996 e a versão 1.4 em abril de 1997.Hudak 2007, p. 5 Esforços posteriores culminaram no Haskell 98, publicado em janeiro de 1999 e que especifica uma versão mínima, estável e portável da linguagem e a biblioteca para ensino. Esse padrão sofreu uma revisão em janeiro de 2003.

A linguagem continua evoluindo, sendo as implementações Hugs e GHC consideradas os padrões de facto. A partir de 2006 começou o processo de definição de um sucessor do padrão 98, conhecido informalmente por Haskell′ ("Haskell Prime").

Haskell 1.0 até 1.4 A primeira versão do Haskell (“Haskell 1.0”) foi definida em 1990. Os esforços do comitê resultaram em uma série de definições da linguagem (1.0, 1.1, 1.2, 1.3 e 1.4).

Haskell 98 No final de 1997, as séries culminaram no Haskell 98, com a intenção de especificar uma versão mais estável e portátil da linguagem acompanhada de uma biblioteca padrão para ensino, e como base para extensões futuras. O comitê expressou satisfação em criar extensões e variantes de Haskell 98 a partir da adição e incorporação de atributos experimentais.

Em fevereiro de 1999, o padrão da linguagem foi originalmente publicado em um relatório chamado de The Haskell 98 Report. Em janeiro de 2003, uma versão revisada foi publicada como Haskell 98 Language and Libraries: The Revised Report. A linguagem continuou a evoluir rapidamente, com a implementação do Compilador Glascow Haskell representando o padrão atual.

Haskell 2010 No começo de 2006, iniciou-se o processo de definir um sucessor para o padrão Haskell 98, informalmente chamado de Haskell Prime. A intenção era de que viesse a ser um processo incremental para revisar a definição da linguagem, produzindo uma revisão nova anualmente. A primeira revisão, chamada de Haskell 2010, foi anunciada em novembro de 2009, e publicado em julho de 2010.

Haskell 2010 é uma atualização incremental da linguagem, incorporando atributos muito utilizados e não controversos previamente ativados por bandeiras específicas do compilador.

Módulos hierárquicos. Módulos consistem de sequências de identificadores em maiúsculo separadas por pontos, ao invés de apenas um identificador. Dessa maneira é possível nomear os módulos de maneira hierárquica (Data.List ao invés de List), apesar de que módulos técnicos ainda estão em um espaço monolítico. Essa extensão foi especificada como um adendo do Haskell 98 e na prática foi universalmente usado. A interface de função estrangeira (FFI), permite ligações para outras linguagens de programação. Apenas ligações para C são especificadas no relatório, mas o design permite para outras ligações de linguagens. Para suportar isso, declarações de tipos de dados não permitem conter construtores, admitindo tipos para dados estrangeiros que não podem ser feitos em Haskell. Essa extensão foi previamente especificada no adendo do relatório de Haskell 98 e vastamente utilizado. Os chamados padrões n+k (definições da forma fact (n+1) = (n+1) * fact n) não são mais permitidos. Esta sintaxe enganava a semântica, onde no código parecia ter sido usado o operador (+), na realidade utilizava-se (-) e (>=). As regras de inferência de tipo foram afrouxadas para permitir que mais programas chequem o tipo. Alguns assuntos da sintaxe (mudança na gramática formal) foram corrigidos: proteções de padrões foram adicionadas, permitindo correspondências entre padrões e proteções; a ordem de operações matemáticas foi especificada de uma maneira mais simples do que na prática; um caso na interação de operadores e comentários da sintaxe léxica da linguagem foi endereçada; e a interação da notação do e if-then-else foi ajustada para eliminar erros inesperados de sintaxe. A diretriz da linguagem foi especificada. Por volta de 2010, dúzias de extensões da linguagem estavam sendo vastamente utilizadas, e GHC (entre outros compiladores) permitiram a diretriz especificar extensões com uma lista de identificadores. Compiladores de Haskell 2010 necessitavam da extensão Haskell2010, e eram encorajadas a suportar outras várias que correspondiam a extensões adicionadas no Haskell 2010.

Características Características do Haskell incluem o suporte a funções recursivas e tipos de dados, casamento de padrões, list comprehensions, guard statements e avaliação preguiçosa, esta, um elo em comum entre os diversos grupos de desenvolvimento da linguagem.Hudak 2007, p. 8 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, torne-se uma tarefa quase trivial em Haskell. Segundo dados de 2002, é a linguagem funcional sobre a qual mais pesquisa está sendo realizada. Muitas variantes têm sido desenvolvidas: versões paralelizáveis do MIT e Glasgow, ambas chamadas Parallel Haskell, outras versões paralelas e distribuídas 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 pelo HUGS. Existe também uma versão do Haskell que permite orientação a aspectos (POA), chamada AspectH.

A linguagem de programação Haskell é fundamentada em Lambda Cálculo, que serve como base no desenvolvimento do artigo e apresenta um único tipo, as funções. Haskell apresenta um tipagem forte e estática, onde as expressões são ligadas a um mesmo tipo em tempo de compilação; e apresenta o polimorfismo universal, e possui um tipo genérico e a mesma definição é usada para vários tipos.

Sintaxe Em Haskell existem apenas funções, e todas as funções são unárias. O que, em outras linguagens de programação seriam funções binárias, ternárias, etc, em Haskell são funções cujo valor de retorno são outras funções - o que se chama currying, termo derivado de Haskell Curry.

Uma função que, dados dois números, retorna sua soma poderia ser declarada como: soma x y =x+y O que parece ser uma função binária é, logicamente, uma função unária (soma, cuja entrada é x) que retorna outra função. Em outras palavras, soma x é a função unária que, dado y retorna x + y, e soma é a função unária que, dado x, retorna x +.

Em Haskell não existem variáveis globais, apenas funções e variáveis locais, definidas dentro do escopo de cada função.

Também não há estruturas de loop, ou instruções do tipo goto.

O if é implementado através de |, que significa a restrição do domínio do argumento da função.

O exemplo abaixo mostra uma implementação do fatorial que usa a recursividade e o if:

fat 0 = 1 fat n | n > 0 = n*fat(n-1)

Em outras palavras: a primeira linha diz que o fatorial de zero é um; a segunda linha diz que o fatorial de um número n qualquer, desde que n seja maior que zero, pode ser calculado a partir do fatorial de (n-1). Esta implementação não é eficiente, mas serve como exemplo didático.

Listas Há duas funcionalidades importantes para a construção de listas. A primeira é a list comprehension, que permite construir listas sob forma de conjuntos. Por exemplo, o código [ x | x <- [0..], x^2>3 ] cria uma lista de elementos x a partir do gerador <- [0..] (o conjunto dos números naturais), que atendam o predicado x^2>3 (o símbolo <- representa o pertence, , da teoria dos conjuntos). Pode-se combinar geradores numa mesma list comprehension.

A segunda funcionalidade é a sequência aritmética, que permite construir listas sob forma de intervalos. Por exemplo, o código [2..10] cria uma lista de inteiros de 2 a 10. Pode-se omitir o fim do intervalo; [2..] gera uma lista infinita de inteiros a partir de 2.

Há três funções primordiais sobre listas em Haskell, das quais outras funções podem ser combinadas.Du Bois A primeira é foldl, que adiciona um operador dado entre cada elemento da lista, retornando o resultado da expressão gerada. Para concatenar uma lista de cadeias de caracteres cadeia = ["Uma", " ", "cadeia"] pode-se usar foldr1 (++) cadeia. A segunda é map, que executa uma função a todos os elementos da lista, retornando uma nova lista. A terceira é filter, que filtra a lista a partir de um predicado.

Tipos de dado A tipagem de Haskell é forte. Cada expressão possui um tipo, e é possível obtê-lo em tempo de compilação através de inferência de tipo. Os tipos básicos da linguagem incluem: