(Parte 1 de 8)

André Rauber Du Bois

Programação Funcional com a Linguagem Haskell

André Rauber Du Bois dubois@macs.hw.ac.uk

André Rauber Du Bois

CAPÍTULO 1 – Programação em Haskell4
1.1 Expressões e Funções4
1.2. Inteiros6
1.4 Caracteres e Strings9
1.5 Números em Ponto Flutuante11
1.6 Tuplas12
CAPÍTULO 2 – Listas em Haskell18
2.1 Listas18
2.3 Funções sobre Listas20
2.5 Definições26
2.6 Outras Funções Úteis sobre Listas30
CAPÍTULO 3 – Conceitos Avançados37
3.2 Composição de Funções39
CAPÍTULO 4 – Classes de Tipo43
4.1 Classes de Tipo43
4.2 Classes Derivadas45
4.4 Algumas Classes Importantes47
4.4.2 Read e Show48

André Rauber Du Bois

CAPÍTULO 5 – Tipos Algébricos50
5.3 Tipos Algébricos Polimórficos55
CAPÍTULO 6 – Abstract Data Types57
6.1 Abstract Data Type (ADT)57
6.2 Exemplo de ADT (Conjuntos)58
CAPÍTULO 7 – IO68
7.1 Interação com o Usuário68
7.2 Arquivos70
CAPÍTULO 7 – Construção de Módulos74

André Rauber Du Bois

CAPÍTULO 1 – Programação em Haskell

1.1 Expressões e Funções

A idéia principal da linguagem Haskell é baseada na avaliação de expressões. A implementação da linguagem avalia (simplifica) a expressão passada pelo programador até sua forma normal. Por exemplo:

Haskell >”Alô Mundo!!” “Alô Mundo!!”

Neste exemplo foi passada para o interpretador Haskell a string (seqüência de caracteres) “Alô Mundo!!”. O sistema respondeu com a mesma seqüência de caracteres, pois esta expressão não pode mais ser avaliada, já encontra-se normalizada. Pode-se utilizar comandos mais complexos:

Haskell> 4 + 3 7 ou

Um comando em Haskell é uma fórmula escrita na sintaxe da linguagem. Em Haskell existem várias funções pré-definidas que podem ser usadas para a construção de expressões:

Haskell> reverse “Alô Mundo!!” “!!odnuM ôlA”

André Rauber Du Bois

A função reverse inverte a ordem dos caracteres em uma string. Apesar de existirem várias funções pré-definidas, a grande idéia da programação funcional é que o usuário defina as suas próprias funções. As funções do usuário são definidas em scripts. Um script contém definições de funções associando nomes com valores e tipos. Em scripts da linguagem Haskell também existem comentários que facilitam uma leitura posterior. Tudo o que for escrito depois de dois travessões (--) é considerado comentário e não é interpretado. Segue um exemplo de script:

-- -- exemplo.hs

-- Neste script apresentam-se algumas definições simples idade :: Int -- Um valor inteiro constante idade = 17 maiorDeIdade :: Bool -- Usa a definição de idade maiorDeIdade = (idade>=18) quadrado :: Int -> Int -- função que eleva um número ao quadrado quadrado x = x * x mini :: Int -> Int -> Int -- função que mostra o menor valor entre dois inteiros mini a b | a <= b = a

| otherwise = b

André Rauber Du Bois

A primeira linha de uma definição é a declaração de tipo. A notação ‘::’ pode ser lida como ‘possui tipo’. Então idade tem tipo Int, que em Haskell é o tipo dos números inteiros. A linha seguinte atribui o valor 17 para idade.

Na definição seguinte é introduzido o tipo Booleano, que pode ter dois valores,

True ou False. No caso, maiorDeIdade tem o valor False pois 17 (valor de idade) é menor do que 18. Na definição de maiorDeIdade foi utilizada a definição de idade. Em Haskell uma definição pode usar qualquer outra definição do mesmo script.

Em scripts encontra-se também definições de funções. A função quadrado no exemplo, é uma função que vai do tipo Int para o tipo Int. A função através de seu argumento calcula uma resposta utilizando uma equação (x * x) que está no lado direito da definição. Por exemplo, se passarmos para o interpretador a função quadrado e como argumento utilizarmos o valor 2 teremos:

Haskell> quadrado 2 4

A função mini devolve o menor valor entre os seus dois argumentos, que são valores do tipo Int. Para se obter a resposta, testam-se os valores para se decidir qual é o menor. Para isso são usados guards que são expressões booleanas iniciadas por uma barra |. No exemplo, se o valor de a é menor ou igual que b a resposta é a, senão passa-se para o próximo guard. Temos então a expressão otherwise, que sempre possui a resposta se todos os outros guards falharem. Ex:

Haskell > mini 2 3 2 Outros detalhes sobre scripts, serão apresentados no decorrer do texto.

1.2. Inteiros

O tipo Int é o tipo dos números inteiros em Haskell. Este tipo possui alguns operadores e funções:

André Rauber Du Bois

+, * Soma e multiplicação de inteiros

- Serve para mudar o sinal de um inteiro ou para fazer a subtração

Tabela 1. Operadores do Tipo Int div Divisão de números inteiros; div 10 3 é 3 mod O resto de uma divisão de inteiros; mod 10 3 é 1 abs Valor absoluto de um inteiro (remove o sinal).

negate Muda o sinal de um inteiro.

Tabela 2. Funções do Tipo Int

como um operador, basta incluir o operador entre parênteses (), e a função entre crases

Qualquer operador pode ser usado como função, e qualquer função pode ser usada Ex:

Haskell> 10 mod 3 1 O programador pode definir os seus próprios operadores em scripts:

Ex:

-- script do meu primeiro operador (&&&) :: Int -> Int -> Int a &&& b | a < b = a

| otherwise = b

André Rauber Du Bois

Pode-se trabalhar com ordenação e igualdade com os números inteiros, assim como com todos os tipos básicos. As funções de ordenação e igualdade tem como argumento dois números inteiros e devolvem um valor do tipo Bool:

> Maior que

>= Maior ou igual

== Igual

/= Diferente

<= Menor ou igual

< Menor

Tabela 3. Ordenação e Igualdade

Ex:

(Parte 1 de 8)

Comentários