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)
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
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
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.
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
Representam Funções Matemáticas?
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)
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}
Quais Diagramas Representam Uma
Função de A em B?
(a) (b)
(c) (d)
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
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
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
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?
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.
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
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
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 );
}
}
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
Programando por Funções
areaCirculo r = pi*r^2
quadrado x = x * x
maior x y
| x >= y = x
| otherwise = y
Programando por Funções
fatorial 1 = 1
fatorial n = n * fatorial (n-1)
f x = 2 * x + 4
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/
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
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
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
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:
Comandos Básicos no GHCi
• Exemplo de Interação, digitando expressões:
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)
Operações Aritméticas
• Soma (+), subtração (-), multiplicação (*), divisão (/),
exponenciação (^) e raiz quadrada (sqrt)
• Agora tente calcular 2^5000 (irá funcionar?)
Operações Aritméticas
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)

Haskell - Introdução

  • 1.
    UNIVERSIDADE ESTADUAL DOSUDOESTE 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 deProgramaçã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
  • 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.
  • 7.
    Funções Matemáticas • Defineum 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
  • 8.
  • 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}
  • 11.
    Quais Diagramas RepresentamUma Função de A em B? (a) (b) (c) (d)
  • 12.
    Funções Matemáticas eProgramaçã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 eProgramaçã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 eProgramaçã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 eProgramaçã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? XComo? • 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
  • 19.
    Vantagens da ProgramaçãoFuncional • 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çãoFuncional 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 escritosem 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
  • 23.
    Programando por Funções areaCirculor = pi*r^2 quadrado x = x * x maior x y | x >= y = x | otherwise = y
  • 24.
    Programando por Funções fatorial1 = 1 fatorial n = n * fatorial (n-1) f x = 2 * x + 4
  • 26.
    Implementações • Hugs – Exclusivamenteum 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 • Haskellpossui 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
  • 31.
    Comandos Básicos noGHCi • Ao executar o GHCi, uma sessão é iniciada • O sistema carrega funções pré-definidas (Prelude.hs) e passa a esperar comandos:
  • 32.
    Comandos Básicos noGHCi • Exemplo de Interação, digitando expressões:
  • 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)
  • 34.
    Operações Aritméticas • Soma(+), subtração (-), multiplicação (*), divisão (/), exponenciação (^) e raiz quadrada (sqrt) • Agora tente calcular 2^5000 (irá funcionar?)
  • 35.
  • 36.
    UNIVERSIDADE ESTADUAL DOSUDOESTE DA BAHIA CURSO DE CIÊNCIA DA COMPUTAÇÃO PROGRAMAÇÃO DECLARATIVA – 2016.2 Fábio M. Pereira (fabio.mpereira@uesb.edu.br)