A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Programação Funcional Tipos Básicos e Programas Simples em Haskell 2a. Seção de Slides."— Transcrição da apresentação:

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

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

3 3 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...

4 4 Números Inteiros Na linguagem Haskell, o tipo de dados Int representa os números inteiros. O valor máximo de Int é 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).

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

6 6 Números e Operações (2) Main> div Main> mod Main> 12 `mod` 5 2 Main> (+) Prelude> (/) Main> div Main> mod Main> 12 `mod` 5 2 Main> (+) Prelude> (/) 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.

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

8 8 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... Main> sales 3 25 Main> sales 0 12 Main> sales 3 25 Main> sales 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 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. Uma definição para sales.

9 9 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 Main> sales 3 9 Main> sales sales :: Int -> Int 2 sales x = 3 x `mod` 5 -- mod x (x+10) `mod` 7 1 sales :: Int -> Int 2 sales x = 3 x `mod` 5 -- mod x (x+10) `mod` 7 Outra definição para sales. Outra definição para sales.

10 10 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 sales(n-1) + sales n Para n=0: totalSales n = sales 0 Para n>0: totalSales n = totalSales (n-1) + sales n

11 11 Programas com Inteiros 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | otherwise= totalSales (n-1) + (sales n) 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | otherwise= totalSales (n-1) + (sales n) Main> totalSales 0 12 Main> totalSales 2 50 Main> totalSales 0 12 Main> totalSales 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 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

12 12 Programas com Inteiros 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | otherwise= totalSales (n-1) + (sales n) 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 totalSales 2 = totalSales 1 + sales 2 = (totalSales 0 + sales 1) + sales 2 = (sales 0 + sales 1) + sales 2

13 13 Programas com Inteiros totalSales 2 = totalSales 1 + sales 2 = (totalSales 0 + sales 1) + sales 2 = (sales 0 + sales 1) + sales 2 = ( ) + 18 = 50 totalSales 2 = totalSales 1 + sales 2 = (totalSales 0 + sales 1) + sales 2 = (sales 0 + sales 1) + sales 2 = ( ) + 18 = 50 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 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

14 14 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

15 15 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 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 maxSales 2 ?? maxSales 1 >= sales 2 ?? maxSales 0 >= sales 1 ?? sales 0 >= sales 1 ?? 12 >= 20 = 20 ?? 20 >= 18 = 20 maxSales 2 ?? maxSales 1 >= sales 2 ?? maxSales 0 >= sales 1 ?? sales 0 >= sales 1 ?? 12 >= 20 = 20 ?? 20 >= 18 = 20 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 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

16 16 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 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! Ineficiência: maxSales(n-1) é calculada 2 vezes!

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

18 18 Programas com Inteiros 12 maxSales :: Int -> Int 13 maxSales n 14 | n == 0 = sales 0 15 | otherwise = maxi (maxSales(n-1)) (sales n) 12 maxSales :: Int -> Int 13 maxSales n 14 | n == 0 = sales 0 15 | otherwise = maxi (maxSales(n-1)) (sales n) Solução alternativa (2a.): 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,

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

20 20 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 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! Definição mais robusta para a função!

21 21 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 8 totalSales :: Int -> Int 9 totalSales n 10 | n == 0 = sales 0 11 | n > 0= totalSales (n-1) + (sales n) 11 | otherwise= 0 8 totalSales :: Int -> Int 9 totalSales n 10 | n >= 0 = totalSales (n-1) + (sales n) 11 | otherwise= 0 8 totalSales :: Int -> Int 9 totalSales n 10 | n >= 0 = totalSales (n-1) + (sales n) 11 | otherwise= 0 Ou também:

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

23 23 Outros Programas 1 fact :: Int -> Int 2 fact n 3 | n <= 0 = 1 4 | otherwise= n * fact (n-1) 1 fact :: Int -> Int 2 fact n 3 | n <= 0 = 1 4 | otherwise= n * fact (n-1) Fatorial de n: Main> fact Main> fact Main> fact Main> fact Main> fact Main> fact Extrapolou os limites de Int.

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

25 25 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.

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

27 27 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.

28 28 Sintaxe f x = x + x + x + 2 f x = x + x + x + 2

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

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

31 31 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

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

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

34 34 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 pode ocupar mais de uma linha | g2= e2... f v1 v2... vn | uma guarda muito longa que pode ocupar mais de uma linha = uma expressão muito longa que pode ocupar mais de uma linha | g2= e2...

35 35 Sintaxe Nomes em Haskell –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

36 36 Sintaxe Comentários de linha: –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).


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

Apresentações semelhantes


Anúncios Google