Este documento apresenta um roteiro sobre programação funcional. Ele discute linguagens de programação, funções matemáticas, programação funcional, vantagens e desvantagens, implementações e comandos básicos da linguagem Haskell.
Slides Lição 6, Betel, Ordenança para uma vida de obediência e submissão.pptx
Haskell - Introdução
1. UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA
CURSO DE CIÊNCIA DA COMPUTAÇÃO
PROGRAMAÇÃO DECLARATIVA – 2016.2
Fábio M. Pereira
(fabio.mpereira@uesb.edu.br)
2. 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
3.
4. 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
5. 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.
6.
7. 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
9. 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)
10. 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}
12. 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
13. 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
14. 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
15. 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?
16. 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.
17. 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
18.
19. 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
20. 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 );
}
}
21. 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
26. 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/
27. 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
28. 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
29. 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
30.
31. 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:
33. 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)
36. UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA
CURSO DE CIÊNCIA DA COMPUTAÇÃO
PROGRAMAÇÃO DECLARATIVA – 2016.2
Fábio M. Pereira
(fabio.mpereira@uesb.edu.br)