haskell - introdução

36
UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA CURSO DE CIÊNCIA DA COMPUTAÇÃO PROGRAMAÇÃO DECLARATIVA – 2016.2 Fábio M. Pereira ([email protected])

Upload: fabio-moura-pereira

Post on 09-Feb-2017

61 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Haskell - Introdução

UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA CURSO DE CIÊNCIA DA COMPUTAÇÃO

PROGRAMAÇÃO DECLARATIVA – 2016.2

Fábio M. Pereira

([email protected])

Page 2: Haskell - Introdução

Roteiro

• Linguagens de Programação

• Funções Matemáticas e Programação

• O Que é Programação Funcional?

• Vantagens da Programação Funcional

• Desvantagens

• Programando por Funções

• Implementações

• Comandos Básicos no GHCi

Page 3: Haskell - Introdução
Page 4: Haskell - Introdução

Linguagens de Programação

• Um programa é uma sequência lógica de tarefas, destinada à computadores

• Uma linguagem de programação é usada para escrever programas: – Diretamente em código de máquina

– Em uma linguagem de baixo nível

– Em uma linguagem de alto nível

• O compilador converte um programa em linguagem de alto nível para linguagem de máquina

Page 5: Haskell - Introdução

Linguagens de Programação

• Código de máquina:

• Baixo nível:

• Alto Nível:

00101011 – 2B

01101111 – 6F

ORG $400

MOVE.B Value1,D0

MOVE.B Value2,D1

ADD.B D0,D1

MOVE.B D1,Result

STOP #$2700

program Teste;

var Nome: String;

begin

write('Nome: ');

readln(nome);

writeln('Nome lido do teclado: ',nome);

readln;

end.

Page 6: Haskell - Introdução
Page 7: Haskell - Introdução

Funções Matemáticas

• Define um mapeamento de um domínio de valores para uma “faixa” de valores

• Conjunto de pares ordenados que relaciona cada elemento de um domínio com um elemento correspondente em uma “faixa” (contradomínio)

• O valor de uma função não depende de conceitos como ordem de execução

• Variáveis não mudam de valor

Page 8: Haskell - Introdução

Representam Funções Matemáticas?

Page 9: Haskell - Introdução

Definição de Função

• Dados dois conjuntos A e B não vazios, uma função de A em B é uma relação que associa a cada elemento x A, um único elemento y B

• Assim, uma função liga um elemento do domínio (conjunto A de valores de entrada) com um segundo conjunto, o contradomínio (conjunto B de valores de saída) de tal forma que a cada elemento do domínio está associado exatamente a um, e somente um, elemento do contradomínio

• O conjunto dos elementos do contradomínio que são relacionados pela f a algum x do domínio é o conjunto imagem, denotado por Im(f)

Page 10: Haskell - Introdução

Qual a Função?

f(x) = x2

Dom (f) = {-3, -2, -1, 0} CD (f) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} Im (f) = {0, 1, 4, 9}

Page 11: Haskell - Introdução

Quais Diagramas Representam Uma Função de A em B?

(a) (b)

(c) (d)

Page 12: Haskell - Introdução

Funções Matemáticas e Programação

• Simplificando, uma função é uma regra para mapeamento (ou associação) de membros de um conjunto (o conjunto domínio) para outro (contradomínio)

• Exemplo: a função “quadrado” deve mapear elementos do conjunto de números inteiros para o conjunto de números naturais

• A definição de uma função é composta de duas partes

– Assinatura: especifica o domínio e o contradomínio

– Regra de mapeamento: especifica o valor do contradomínio associado com cada valor do domínio

Page 13: Haskell - Introdução

Funções Matemáticas e Programação

• Exemplo

square : integer natural (assinatura)

square(n) n x n (regra de mapeamento)

(é definida por)

n (parâmetro)

square(2) resulta no valor 4, onde “2” é o argumento

“n” é uma variável matemática, que é diferente de uma variável de programação o seu valor não muda

Page 14: Haskell - Introdução

Funções Matemáticas e Programação

• Novas funções podem ser criadas pela combinação de funções

– Composição de funções: F G o H • A aplicação de F é equivalente a aplicação de H e a aplicação de G ao

resultado

• Em Linguagens Imperativas a função é definida de forma procedural

• Em Funções Matemáticas a função é definida de forma aplicativa ou declarativa

– A regra de mapeamento é definida em termos de combinações e aplicações de outras funções

Page 15: Haskell - Introdução

Funções Matemáticas e Programação

• Muitas Funções Matemáticas são definidas recursivamente – A definição da função contém uma aplicação dela mesma

• Fatorial de um número n! if n=0 then 1 else n*(n-1)!

• Função de naturais para booleanos que determina se um número é primo primo(n) if n=2 then true else p(n, n div 2)

p(n,i) if (n mod i) = 0 then false

else if i=1 then true else p (n, i-1)

• Qual a função de naturais para booleanos que determina se um número é par?

Page 16: Haskell - Introdução

Resumindo, O Que É Programação Funcional?

• C, Java, Pascal, Ada, ..., são linguagens imperativas

– Consiste de uma sequência de comandos que são executados estritamente um após o outro

• Haskell é uma linguagem funcional

– Um programa funcional é uma única expressão, que é executada pela avaliação da expressão

• Planilha eletrônica: o valor de cada célula é calculado em função dos valores de outras células

• Foco em o que deverá ser computado, e não em como deverá ser computado.

Page 17: Haskell - Introdução

O Que? X Como?

• Em uma planilha eletrônica:

– Não especificamos a ordem na qual as células devem ser calculadas: a planilha irá automaticamente computar as células em uma ordem que respeite as suas dependências

– Não dizemos a planilha como alocar memória: ela nos apresenta um plano aparentemente infinito de células

– Na maioria das vezes, especificamos o valor de uma célula através de uma expressão em vez de usarmos uma sequência de comandos

Page 18: Haskell - Introdução
Page 19: Haskell - Introdução

Vantagens da Programação Funcional

• Programas muito mais concisos que os seus equivalentes em linguagem imperativa (2-10 vezes)

• Fácil entendimento: você é capaz de entender o programa sem qualquer conhecimento prévio da linguagem

• É uma linguagem fortemente tipada, evitando erros de programação

• Sistema de tipos menos restritivo (polimorfismo): reuso de código

• Funções de alta-ordem: abstração poderosa • Gerenciamento interno de memória

Page 20: Haskell - Introdução

Vantagens da Programação Funcional

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]

qsort( a, lo, hi ) int a[], hi, lo;

{

int h, l, p, t;

if (lo < hi) {

l = lo;

h = hi;

p = a[hi];

do {

while ((l < h) && (a[l] <= p))

l = l+1;

while ((h > l) && (a[h] >= p))

h = h-1;

if (l < h) {

t = a[l];

a[l] = a[h];

a[h] = t;

}

} while (l < h);

t = a[l];

a[l] = a[hi];

a[hi] = t;

qsort( a, lo, l-1 );

qsort( a, l+1, hi );

}

}

Page 21: Haskell - Introdução

Desvantagens

• Programas escritos em linguagens imperativas, como C por exemplo, são geralmente mais rápidos e usam menos memória que programas em Haskell – Em aplicações onde a performance é fundamental, uma

linguagem imperativa seria uma melhor escolha que Haskell

– C oferece maior controle sobre o modo exato como a computação é realizada

Page 22: Haskell - Introdução
Page 23: Haskell - Introdução

Programando por Funções

areaCirculo r = pi*r^2

quadrado x = x * x

maior x y

| x >= y = x

| otherwise = y

Page 24: Haskell - Introdução

Programando por Funções

fatorial 1 = 1

fatorial n = n * fatorial (n-1)

f x = 2 * x + 4

Page 25: Haskell - Introdução
Page 26: Haskell - Introdução

Implementações

• Hugs

– Exclusivamente um interpretador, implementa quase todo o padrão Haskell 98 e algumas extensões

– Escrito em C, funciona em quase todas as plataformas

– Possui uma biblioteca gráfica

– Último release: maio/2006 (sem manutenção)

– https://www.haskell.org/hugs/

Page 27: Haskell - Introdução

Implementações

• GHC

– É tanto um interpretador como um compilador

– O ambiente interativo é mais lento que Hugs, mas permite definição de funções no ambiente (em Hugs deve-se colocar em um arquivo)

– Implementa o Haskell 2010

– Bom suporte a interface com outras linguagens

– Possui interface gráfica

– Último release: dezembro/2014

– https://www.haskell.org/downloads

Page 28: Haskell - Introdução

Implementações

• NHC

– É apenas um compilador

– Produz executável menor e mais rápido que GHC98

– Dá suporte ao Haskell 98 e algumas extensões

– Sem manutenção

• UHC

– Implementação da Utrecht University

– Dá suporte ao Haskell 98 e algumas extensões

• JHC

– Compilador experimental com o objetivo de testar novos métodos de otimização

Page 29: Haskell - Introdução

Haskell GUIs

• Haskell possui pelo menos quatro kits de ferramentas para programação de interface gráfica:

– wxHaskell – fornece uma interface Haskell para o kit de ferramentas multi-plataformas wxWidgets com suporte a Windows, OS X, e Gtk+ no GNU/Linux, dentre outros

– Gtk2Hs – fornece uma interface Haskell para a biblioteca GTK+

– hoc – fornece uma ponte Haskell para Objective-C que permite a usuários acessarem a biblioteca Cocoa no MacOS X

– qtHaskell – fornece um conjunto de pontes Haskell para a Qt Widget Library da Nokia

Page 30: Haskell - Introdução
Page 31: Haskell - Introdução

Comandos Básicos no GHCi

• Ao executar o GHCi, uma sessão é iniciada

• O sistema carrega funções pré-definidas (Prelude.hs) e passa a esperar comandos:

Page 32: Haskell - Introdução

Comandos Básicos no GHCi

• Exemplo de Interação, digitando expressões:

Page 33: Haskell - Introdução

Alguns Comandos Importantes

• :? imprime a lista de todos os comandos

• :q abandona o interpretador

• :load carrega definições a partir de um arquivo

• :e chama o editor

• :e exemplo1.hs editar o arquivo exemplo1.hs

• :l exemplo1.hs carregar o arquivo exemplo1.hs

• :a exemplo2.hs carregar o arquivo exemplo2.hs

• :r recarrega um arquivo modificado

• :m + nomeModulo carrega módulo (biblioteca) para a memória

• :m – nomeModulo remove módulo da memória

• :! comando executar um comando do sistema operacional;

• :set visualiza configurações do GHCi (:s +t)

Page 34: Haskell - Introdução

Operações Aritméticas

• Soma (+), subtração (-), multiplicação (*), divisão (/), exponenciação (^) e raiz quadrada (sqrt)

• Agora tente calcular 2^5000 (irá funcionar?)

Page 35: Haskell - Introdução

Operações Aritméticas

Page 36: Haskell - Introdução

UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA CURSO DE CIÊNCIA DA COMPUTAÇÃO

PROGRAMAÇÃO DECLARATIVA – 2016.2

Fábio M. Pereira

([email protected])