E N D
Rafael Pinto Frederico Corrêa HASKELL
Origem Haskell é uma linguagem puramente funcional, de propósito geral cujo nome vem do lógico Haskell Brooks Curry, criador de um trabalho em lógica que serviu de base para as linguagens funcionais. Foi criada em 1988 por um comitê de 15 membros para satisfazer, entre outros, os seguintes objetivos:
Objetivos • Deve ser aceitável para ensino, pesquisa e aplicações, incluindo grandes sistemas. • Deve ser disponibilizada gratuitamente. • Deve ser baseada em idéias que satisfaçam um grande consenso (por isso o comitê). • Deve reduzir a diversidade desnecessária nas linguagens funcionais (visa ser um padrão).
Execução Existem diversas implementações da linguagem Haskell, incluindo • interpretadores (Hugs) e • compiladores (GHC , nhc98).
Portalibidade Além de possuir diversas implementações, cada uma delas está disponível para diversos sistemas operacionais, podendo gerar executáveis para várias plataformas. Outra alternativa está no interpretador Hugs. Deve-se, porém, observar o uso de bibliotecas específicas para determinados sistemas operacionais (como a biblioteca Windows).
Tipos de Dados Tipos primitivos: • Integer (tamanho arbitrário) • Int • Float • Double • Bool • Char
Tipos de Dados Tipos estruturados: • Tuplas (structs) Ex.: circulo1 = (azul,15) • Listas (arrays) Ex.: pares [0,2,4,6..]
Sinônimos É possível definir sinônimos de tipos. Exemplo: type String = [Char] type Person = (Name, Address) type Name = String
Tipagem Haskell apresenta tipagem dinâmica, as variáveis não precisam ser explicitamente declaradas e seu tipo pode ser inferido a partir do contexto. Ex.: print x Haskell sabe que x deve ser um array de caracteres. Caso contrário, um erro de overloading é retornado (pois não há sobrecarga para o tipo utilizado).
Tipos Customizados É possível criar novos tipos com declarações 'data'. Exemplos: data Bool = True | False data Color = Red | Green | Blue | Indigo | Violet data Natural = [0,1,2..]
Precedência e Associatividade Haskell faz associatividade pela esquerda, funções possuem precedência sobre operadores: "f x y + g a b" é "parseado" como "((f x) y) + ((g a) b)"
Encapsulamento e Proteção Where: possibilitam a declaração de funções locais. Data: abstração de dados. Funções de ordem mais alta: possibilitam a criação de funções a partir de partes de outras funções. Ex.: 'member' é uma função tal que 'member x a' retorna verdadeiro se a está na lista x. vogal = member ['a','e','i','o','u'] Omitindo o segundo parâmetro de member, criou-se a função 'vogal a' de maior ordem.
Polimorfismo Há polimorfismo universal, a função possui um tipo genérico e a mesma definição é usada para vários tipos. O mesmo código é reusado e reaplicado a cada versão da função. Uma função qualquer de ordenamento com o mesmo nome poderia ordenar um vetor de inteiros, números em ponto-flutuante, ou um vetor de caracteres (string) sem problemas.
Tratamento de Erros Através da função 'error' e nas próprias definições de funções. Ex.: fac n | n < 0 = error "input to fac is negative" | n == 0 = 1 | n > 0 = product [1..n] Não existe nenhum tratamento mais avançado para erros no módulo básico. Módulos que podem gerar erros (Ex.: I/O), trazem funções para tratá-los.
Avaliação de Expressões Haskell possui um método de avaliação de expressões chamado 'lazy evaluation', que apenas avalia o valor de expressões quando realmente necessário. Isso permite construções interessantes: fibs = 0 : 1 : [ a + b | (a, b) <- zip fibs (tail fibs)] é uma lista com os números de Fibonacci. Ex.: "fibs !! 20" retorna o vigésimo número de Fibonacci. Note que fibs é uma lista potencialmente infinita!
Variações • GPH, Glasgow Parallel Haskell: variação de Haskell com estruturas para diferenciar construções paralelas (par) de seqüenciais (seq). • O'Haskell: Versão (mais) orientada a objetos de Haskell.
Exemplo 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] Explicando: a função qsort, em ambas implementações, trabalha sobre listas. Na primeira, uma lista vazia, retorna uma lista vazia. Na segunda, chama o primeiro elemento de x e o resto de xs. Chama qsort nos elementos menores que x, concatena isso com x (pivô) e concatena com os maiores ou iguais a x.
Para Humilhar... Agora com 1 linha (se conseguirem enxergar): qsort a | (a == []) = [] | (a /= []) = qsort [y | y <- tail a, y < head a] ++ [head a] ++ qsort [y | y <- tail a, y >= head a]
Bibliografia • The Haskell Home Page: www.haskell.org • Haskell Reference: www.zvon.org/other/haskell/Outputglobal/