Baixe o app para aproveitar ainda mais
Prévia do material em texto
Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 1 Construindo funções 1a parte Programação Funcional 9 Um programa funcional consiste, basicamente, de definições de funções (colocadas em um arquivo chamado, genericamente, de script). 9 Funções simples são usadas para definir outras mais complexas que são, por sua vez, utilizadas para definir outras funções ainda mais complexas e etc, etc, etc. 9 Finalmente, definimos uma função para computar a saída do programa como um todo a partir de seus valores de entrada Definições e Tipos 9 Uma definição fornece um nome a um valor O nome começa com uma letra minúscula. Os demais só podem ter letras ou algarismos. Tipo especifica que espécie de valor area é e tem começar por letra maiúscula. area :: Int area = 41 * 37 Uma expressão diz como o valor é computado :: significa tem tipo de Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 2 Exemplo area::Int area=34*12 9 Uma definição de função especifica como o resultado é computado a partir de seus argumentos. area é o nome da função. Tipo do primeiro argumento(Int), tipo do segundo argumento(Int), e tipo do resultado(Int), area :: Int->Int->Int area a b = a * b Os argumentos são nomes dados após o nome da função(a e b). Argumentos de funções não precisam e, muitas vezes, não podem vir entre parênteses! O corpo da função especifica como o resultado é computado. Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 3 Exemplo area :: Int -> Int -> Int area a b = a*b Atenção para a diferença aarreeaa 33 44 éé uummaa cchhaammaaddaa ddee ffuunnççããoo aarreeaa ((sseemm aarrgguummeennttooss)) éé uumm vvaalloorr ddee ffuunnççããoo Vamos ver outros exemplos. dobro :: Int -> Int dobro x = 2*x Nome da função: dobro Tipo do argumento: Int Tipo da função: Int Nomes dos argumentos: x Corpo da função: 2*x media :: Float -> Float -> Float media x y = (x + y) / 2.0 Nome da função: media Tipos dos argumentos: Float e Float Tipo da função: Float Nomes dos argumentos: x e y Corpo da função: (x + y) / 2.0 media :: Float -> Float -> Int media x y = ceiling ((x + y) / 2) Nome da função: media Tipos dos argumentos: Float e Float Tipo da função: Int Nomes dos argumentos: x e y Corpo da função: ceiling ((x + y) / 2) Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 4 reajuste::Float->Float->Float reajuste s p=s+s*p/100 Nome da função: reajuste Tipos dos argumentos: Float e Float Tipo da função: Float Nomes dos argumentos: s e p Corpo da função: s+s*p/100 Definições por Casos Freqüentemente, programas precisam tomar decisões e computar diferentes resultados em diferentes casos. Um exemplo clássico e o teste que fazemos para descobrir se uma pessoa é maior de idade. Se idade>= 18 então escrever “maior” senão escrver “menor” O Tipo dos Booleano Uma condição em Haskell é como na maioria das linguagens: verdadeira ou falsa Em Haskell , os tipos booleanos são: True, False :: Bool Os operadores relacionais(>=, <=, >, <,== , /= ) produzem tipos Booleanos Tendo em vista o exposto acima, fica evidente a necessidade da estrutura do if na linguagem HASKELL. As sintaxes: if teste then …. else .... ou if teste1 then …. else if teste2 then .... Vamos exercitar. 1) Criar uma função que recebe um número e exibe uma das mensagens: Par / Impar. parImpar::Int->String parImpar a= if mod a 2 ==0 then "Par" else "Impar" 2) Criar uma função que recebe um número e exibir uma das mensagens: positivo, negativo ou nulo. 3) Criar uma função que recebe três números e exibir uma tupla contendo os dois maiores. Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 5 4) Criar uma função que receba um número e exiba uma das mensagens: múltiplo de 10 ou múltiplo de 5 ou múltiplo de 2 ou não é múltiplo de nenhum deles. 5) Criar uma função que receba dois números e exiba uma das mesnagens: maior eh ... ou iguais. Guarda Entretanto, o número de testes pode ser tão grande que até dificulta a construção do código. A linguagem HASKELL apresenta uma solução para esse caso: guarda. Sendo assim uma função pode ser definida através de guardas que são expressões booleanas associadas à cada equação que define a função. Portanto, cada guarda é testada uma por vez, de cima para baixo. Para a primeira guarda que for satisfeita a equação correspondente é executada. Veja um exemplo usando guarda. Cuidado com o alinhamento e a identação. Criar uma função para ler três números inteiros e exibir o menor deles. Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 6 Resposta ao carregar menor :: Int -> Int -> Int -> Int menor x y z | (x <= y) && (x <= z) = x | (y < x) && (y < z) = y | otherwise = z Agora vamos refazer todos os exercícios das páginas 4 e 5 usando guarda. No futuro, você decide. Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 7 Lista de Exercícios 1) Construa uma função que receba quatro valores que representam duas notas e respectivos pesos. A função retorna a média ponderada. 2)Construa uma função cujos parâmetros representam a largura, comprimento de um terreno retangular e o preço do metro linear. A função retorna o custo total. 3) Construa uma função que receba o dividendo e o divisor e exiba o quociente inteiro da divisão e o resto. 4)Construa uma função que receba data no formato ddmmaaa e exiba separados: o dia, mês e o ano. 5)Construa uma função que receba três números e exiba o maior. 6) Construa uma função que receba três números e exiba os dois maiores. 7) Construa uma função que exiba n tríades de Pitágoras. 8) Construa uma função que eleva um número a qualquer expoente(potência) 9) Construa uma função que receba uma lista e gere uma nova lista só com os números pares. 10)Construa uma função que receba uma lista e exiba a quantidade de números pares. 11) Construa uma função que gere uma lista com os n primeiros múltiplos de num. 12) Construa uma função que receba um número e gere uma lista com todos os divisores do número. 13) Construa uma função que receba um número e exiba a soma dos divisores do número. 14)Construa uma função que receba um número e exiba a quantidade de divisores do número. 15) Construa uma função que receba um número e informe se ele é, ou não, primo. 16) Construa uma função que receba um número e informe se ele é, ou não, perfeito. 17) Construa uma função que receba uma lista e gere uma nova lista contendo todos os números primos da lista Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 8 18) Construa uma função que receba uma lista e gere uma nova lista contendo todos os números perfeitos da lista Sistemas de Informação Paradigma Funcional Prof.: Anita Maciel 9 Bibliografia MUYLAERT, J. Introdução à Programação em Haskell.ppt.Rio: 2001 MUYLAERT, J. Notas de aula. Rio: 2003 Construindo funções 1a parte Programação Funcional Definições e Tipos Atenção para a diferença Definições por Casos Lista de Exercícios
Compartilhar