Programação Funcional

Slides:



Advertisements
Apresentações semelhantes
IFTO ESTRUTURA DE DADOS AULA 05 Prof. Manoel Campos da Silva Filho
Advertisements

Estruturação de Linguagens (Pascal e C++)
Software Básico Silvio Fernandes
Palestras, oficinas e outras atividades
MÁQUINAS UNIVERSAIS Fabrício Dias
Programação Funcional
Introdução à Programação usando Processing Programação Gráfica 2D Animações Exercício Animações 14/10/09 Bruno C. de Paula 2º Semestre 2009 > PUCPR >
14/10/09 Uma animação possui: Início; Passo; Fim; 1.
Nome : Resolve estas operações começando no centro de cada espiral. Nos rectângulos põe o resultado de cada operação. Comprova se no final.
Copyright (c) 2003 by Valery Sklyarov and Iouliia Skliarova: DETUA, IEETA, Aveiro University, Portugal.
FOLHA DE CÁLCULO 1.
Sumário, aula 10 Exercícios sobre elasticidade Elasticidade e despesa
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 4.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 9.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 2.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3.
Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 11.
Múltiplos Os múltiplos de um número inteiro obtêm-se multiplicando esse número por 0, 1, 2, 3, 4, 5, 6, ... Exemplos: M5= {0, 5, 10, 15, 20,
Software Básico Silvio Fernandes
Excel Profa. Cristina M. Nunes.
Universidade Federal de São Carlos Introdução à Linguagem C Comandos.
Campus Curitiba Departamento Acadêmico de Matemática Angela Olandoski Barboza UTFPR – Damat.
SISTEMAS DE EQUAÇÕES.
Algoritmos e Programação Linguagens de Programação Teoria Aula 5 (05/05) Universidade Federal do Vale do São.
Análise de regressão linear simples: abordagem matricial
Árvores.
BCC101 – Matemática Discreta
LINGUAGEM C.
Linguagem PHP Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Aula 6 Subprogramas Universidade do Vale do Rio dos Sinos
1 Aula 7 ImplementandoSubprogramas Universidade do Vale do Rio dos Sinos
Programação Baseada em Objectos Desenho de TAD
Revisão da Linguagem C.
Aula de reposição Prof. Grace e Ângela
Classes e objetos Arrays e Sobrecarga
Classes e objetos P. O. O. Prof. Grace.
Apontadores ou Ponteiros
Provas de Concursos Anteriores
MECÂNICA - ESTÁTICA Vetores Forças Cap. 2.
Calculada a solução óptima
Impressão de etiquetas
Semana 03: Comandos de desvio de fluxo. Expressões lógicas.
Momentos de Inércia Cap. 10
MECÂNICA - DINÂMICA Cinemática de uma Partícula Cap Exercícios.
PROGRAMAÇÃO ESTRUTURADA II
Conteúdos do tutorial O que é um Slide Mestre?
1 António Arnaut Duarte. 2 Sumário: primeiros passos;primeiros passos formatar fundo;formatar fundo configurar apresentação;configurar apresentação animação.
Funções Universidade Federal de Ouro Preto - UFOP
Salas de Matemática.
Coordenação Geral de Ensino da Faculdade
Listas: Haskell x Prolog
Programação Funcional
Entendendo as definições de classe
Análise Fatorial Factor analysis.
Inserir crédito para cliente
Semana 03 Comandos de desvio de fluxo. Expressões lógicas.
É u m e l e m e n t o f u n d a m e n t a l
EXERCÍCIOS PARA GUARDA-REDES
1 2 Observa ilustração. Cria um texto. Observa ilustração.
Aula 6 - Estruturas de Controle
Campus de Caraguatatuba Aula 2: Somatório e Produtório
Faculdade Talentos Humanos - FACTHUS - Algoritmo I - Rogério Rodrigues
FORMATANDO O TRABALHO NO WORD 2007
BCC /01 Aula Teórica 09 Funções Material Didático Proposto. 1 BCC701 – Programação de Computadores I Universidade Federal de Ouro Preto Departamento.
BCC 101 – Matemática Discreta I
Planilha Eletrônica - Excel
Campus de Caraguatatuba Aula 9: Noções Básicas sobre Erros (3)
GINÁSTICA LABORAL UM NOVO CAMINHO.
Programação Funcional
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
Transcrição da apresentação:

Programação Funcional Tipos Básicos e Programas Simples em Haskell 2a. Seção de Slides

Méritos para: Vladimir Oliveira Di Iorio (http://www.dpi.ufv.br/~vladimir/)

Hoje, ... Tipos de dados (Int) Apesar de hoje falarmos sobre tipos de dados, em Haskell o interpretador procura advinhar (sempre) o tipo de dado que voce está usando. Mais tarde... Será importante => classes de tipos Há uma hierarquia de tipos com classes etc: ver figura botão no winhugs Logo, não se preocupe...

Números Inteiros Na linguagem Haskell, o tipo de dados Int representa os números inteiros. O valor máximo de Int é 2147483647. O tipo Integer também representa números inteiros, sem restrição de tamanho. A vantagem de usar Int é um possível ganho em eficiência (depende da implementação).

Números e Operações (1) Operações aritméticas: +, -, *, /, div, mod, abs. Comparação: >, <, >=, <=, ==, /=. Exemplos: Main> 5 + 3 8 Main> 10 <= 20 True Main> 10 / 3 3.33333

Números e Operações (2) Main> div 22 5 4 Main> mod 12 5 2 Main> 12 `mod` 5 Main> (+) 5 3 8 Prelude> (/) 10 3 3.33333 Qualquer função com 2 parâmetros pode ser usada na forma infixa, usando `` (sinais tipo crase) Operadores entre parênteses são tratados como funções.

Números e Operações (3) Alguns cuidados: Exemplos: Prelude> mod 13 5 3 Prelude> 13 'mod’ 5 ERROR - Improperly terminated character constant Prelude> 13 `mod` 5 Prelude>

Programas com Inteiros Suponha uma função sales :: Int -> Int . A função sales retorna o número de unidades vendidas, de um determinado produto, se for fornecido o número do dia desejado. Os dias são numerados como 0,1,2 ... 1 sales :: Int -> Int 2 sales x 3 | x == 0 = 12 4 | x == 1 = 20 5 | x == 2 = 18 6 | x == 3 = 25 7 | otherwise = 0 Uma definição para sales. Main> sales 3 25 Main> sales 0 12

Programas com Inteiros Suponha uma função sales :: Int -> Int . Leia-se: “sales tem os tipos... devolvendo o tipo ...” A função sales retorna o número de unidades vendidas, de um determinado produto, se for fornecido o número do dia desejado. Os dias são numerados como 0,1,2 ... Main> sales 3 9 Main> sales 0 3 1 sales :: Int -> Int 2 sales x = 3 x `mod` 5 -- mod x 5 4 + (x+10) `mod` 7 Outra definição para sales.

Programas com Inteiros Problema: definir totalSales :: Int -> Int , função que retorna o total de vendas até um determinado dia. totalSales 2 = sales 0 + sales 1 + sales 2 totalSales n = sales 0 +...+ sales(n-1) + sales n Para n=0: totalSales n = sales 0 Para n>0: totalSales n = totalSales (n-1) + sales n

Programas com Inteiros 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | otherwise = totalSales (n-1) + (sales n) 1 sales :: Int -> Int 2 sales x 3 | x == 0 = 12 4 | x == 1 = 20 5 | x == 2 = 18 6 | x == 3 = 25 7 | otherwise = 0 Main> totalSales 0 12 Main> totalSales 2 50

Programas com Inteiros 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | otherwise = totalSales (n-1) + (sales n) totalSales 2 = totalSales 1 + sales 2 = (totalSales 0 + sales 1) + sales 2 = (sales 0 + sales 1) + sales 2

Programas com Inteiros 1 sales :: Int -> Int 2 sales x 3 | x == 0 = 12 4 | x == 1 = 20 5 | x == 2 = 18 6 | x == 3 = 25 7 | otherwise = 0 totalSales 2 = totalSales 1 + sales 2 = (totalSales 0 + sales 1) + sales 2 = (sales 0 + sales 1) + sales 2 = (12 + 20) + 18 = 50

Programas com Inteiros Problema: definir maxSales :: Int -> Int , função que retorna o valor máximo (a maior venda) de unidades vendidas em um dia, em determinado período. maxSales n = máximo entre sales 0, ..., sales n Para n=0: maxSales n = sales 0 Para n>0: maxSales n = máximo entre maxSales(n-1) e sales n

Programas com Inteiros 12 maxSales :: Int -> Int 13 maxSales n 14 | n == 0 = sales 0 15 | maxSales(n-1) >= sales n = maxSales(n-1) 16 | otherwise = sales n 1 sales :: Int -> Int 2 sales x 3 | x == 0 = 12 4 | x == 1 = 20 5 | x == 2 = 18 6 | x == 3 = 25 7 | otherwise = 0 maxSales 2 ?? maxSales 1 >= sales 2 ?? maxSales 0 >= sales 1 ?? sales 0 >= sales 1 ?? 12 >= 20 = 20 ?? 20 >= 18

Programas com Inteiros 12 maxSales :: Int -> Int 13 maxSales n 14 | n == 0 = sales 0 15 | maxSales(n-1) >= sales n = maxSales(n-1) 16 | otherwise = sales n Ineficiência: maxSales(n-1) é calculada 2 vezes!

Programas com Inteiros Solução alternativa (2a.): 12 maxSales :: Int -> Int 13 maxSales n 14 | n == 0 = sales 0 15 | otherwise = maxi (maxSales(n-1)) (sales n) 16 maxi :: Int -> Int -> Int 17 maxi m n 18 | m >= n = m 19 | otherwise = n

Programas com Inteiros Solução alternativa (2a.): 12 maxSales :: Int -> Int 13 maxSales n 14 | n == 0 = sales 0 15 | otherwise = maxi (maxSales(n-1)) (sales n) Esta solução é mais clara que a primeira, destacando os casos da recursão (n == 0 e n > 0). É mais eficiente que a primeira, pois realiza menos cálculos. É elegantíssima... Duas funções como argumentos em maxi,

Reformulando Programas 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | otherwise = totalSales (n-1) + (sales n) totalSales -2 = totalSales (-3) + sales (-2) = (totalSales (-4) + sales (-3)) + sales (-2) = ...

Reformulando Programas 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | n > 0 = totalSales (n-1) + (sales n) 11 | otherwise = 0 Definição mais robusta para a função!

Reformulando Programas 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | n > 0 = totalSales (n-1) + (sales n) 11 | otherwise = 0 Ou também: 8 totalSales :: Int -> Int 9 totalSales n 10 | n >= 0 = totalSales (n-1) + (sales n) 11 | otherwise = 0

acima para multiplicar números negativos também ! Outros Programas Multiplicação entre dois números, usando a soma: mult :: Int -> Int -> Int mult n 1 = n mult n m = n + mult n (m-1) Main> abs (-13) 13 Main> mult 6 7 42 Alterar o programa acima para multiplicar números negativos também !

Extrapolou os limites de Int. Outros Programas Fatorial de n: 1 fact :: Int -> Int 2 fact n 3 | n <= 0 = 1 4 | otherwise = n * fact (n-1) Main> fact 5 120 Main> fact 13 1932053504 Main> fact 14 1278945280 Extrapolou os limites de Int.

Outros Programas Fatorial de n: Main> fact 13 1932053504 1 fact2 :: Integer -> Integer 2 fact2 n 3 | n <= 0 = 1 4 | otherwise = n * fact2 (n-1) Main> fact 13 1932053504 Main> fact2 13 6227020800 Main> fact2 30 265252859812191058636308480000000

Sintaxe Definições e layout: Em Haskell, o layout de um programa é utilizado para determinar quando termina a definição de uma função e quando começa a próxima. Uma definição termina com o primeiro elemento no mesmo nível de indentação (ou à esquerda deste). Um cuidado: ao alinhar os programas em Haskell, as funções tem que estar na mesma coluna (limitação, eventualmente, corrigida em versões mais novas). Ex: se f1 começa na coluna 13, então todas as demais funções f2, f3 .... devem começar nesta coluna.

Onde termina a definição da função f ? Sintaxe f x = x + x Onde termina a definição da função f ?

Sintaxe f x = x + x Até que apareça alguma definição nesse nível de indentação, todos os elementos pertencerão à definição de f.

Sintaxe f x = x + x + x + 2

Sintaxe f x = x + x + x + 2 g x y = ...

Sintaxe f x = x + x + x + 2 g x y = ...

Sintaxe Definições e layout: Outra forma para determinar o fim de uma definição é utilizar um símbolo terminador. Em Haskell, o símbolo terminador é ";" . Não usual! Exemplo: f x = x + x; g x y = x * y

Sintaxe Erro comum: Mensagem de erro: f x = x + 1 ERROR ... Syntax error in expression (unexpected ";", possibly due to bad layout)

Sintaxe Layout recomendado: f v1 v2 ... vn | g1 = e1 | g2 = e2 ... | otherwise = er (ou | gr = er) g x1 x2 ... Xn ...........

Sintaxe Quando expressões ou guardas são muito longas: f v1 v2 ... vn | uma guarda muito longa que pode ocupar mais de uma linha = uma expressão muito longa que | g2 = e2 ...

Sintaxe Nomes em Haskell Palavras reservadas: Começam com uma letra (minúscula), seguida (opcionalmente) por letras, dígitos, "_" e " ' "; Começando com minúscula: funções e variáveis; Começando com maiúscula: nomes de módulos, nomes de tipos e contrutores de tipo (ex: True e False). Palavras reservadas: case class data default deriving else hiding if import in infix infixl infixr instance interface let module of renaming then to type where

Sintaxe Comentários de linha: Comentários aninhados: Símbolo usado: -- O texto à direita é considerado comentário. Comentários aninhados: Símbolos usados: {- -} Podem se estender por várias linhas. Agem como parêntesis, podendo existir comentários dentro de outros comentários (aninhados).