Programação Funcional

Slides:



Advertisements
Apresentações semelhantes
Estruturação de Linguagens (Pascal e C++)
Advertisements

Programação Funcional
LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS INTRODUÇÃO AOS APLICATIVOS JAVA Prof. Thiago Pereira Rique
INTRODUÇÃO AOS APLICATIVOS JAVA
Tipos de dados, Variáveis, Expressões e Operadores
Elsa Carvalho 49 Universidade da Madeira Departamento de Matemática e Engenharias Programação em Lógica e Funcional (2000/01) (Actualizado em 2005/06)
Introdução à Linguagem PASCAL Prof. Luis Otavio Alvares
Construção de Algoritmos 1
LINGUAGEM C.
Rafael Pinto Frederico Corrêa
Programação para Engenharia I
YACC.
Unidades de Armazenamento
Revisão da Linguagem C.
Introdução a Programação JAVA
Minimização de Circuitos Lógicos
João Lucas de Oliveira Torres
CAPÍTULO 05 Listas.
Linguagem de Expressão (EL)
Rodrigo Cristiano Silva
Introdução a Computação e Cálculo Numérico
Introdução a Computação e Cálculo Numérico
Aula prática 7 Strings Monitoria de Introdução à Programação
Sub-programas. Mecanismo de composição de programas Sub-programa está para peça de LEGO assim como um programa está para a construção.
Prof. Natalia Castro Fernandes Engenharia de Telecomunicações – UFF 2º semestre/2012.
Linguagem de Programação II Parte VII
Linguagens imperativas: Aula prática
Programação Funcional
Seminário 1: Revisão de C
Fábio de Oliveira Borges
Introdução a aplicativos Java
Expressões e Instrução de Atribuição
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
Operadores e Atribuições Capítulo 3
Programação em C++ Compiladores
Paradigmas de Programação - prof Gláucya Carreiro Boechat1 Elaborando um Programa Prof.: Gláucya Carreiro Boechat Universidade.
Linguagem de Programação JAVA Técnico em Informática Professora Michelle Nery.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Tipos de Dados Operadores
Algumas notas sobre a linguagem de programação C
Estruturas de Dados Aula 6: Cadeias de Caracteres
Tipos de dados inteiro caracter real logico
Lambda Cálculo & Programação Funcional
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Faculdade Pernambucana - FAPE Setembro/2007
Funções como Valor ©André Santos e Marcelo d’Amorim.
Haskell Programação Funcional Diego Lima Rubem Moreira.
Fundamentos de linguagens de programação
Linguagem C.
DSC/CCT/UFCG Carga Horária: 60 h Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel.
Programação de Computadores - 1
PROGRAMAÇÃO II – PARTE 3 Profa. Maria Augusta Constante Puget.
Programação Computacional Aula 9: Meu primeiro programa em C
Tipos de Dados Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em sua memória. Estas informações podem.
Profa. Maria Augusta Constante Puget
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
PARADIGMAS DE LINGUAGENS EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Tipos de Dados, Variáveis, Expressões Lógicas e Aritméticas
Programação estruturada unidade 2
Haskell (é uma função polimorfica) Laboratório Rafael Borges
VARIÁVEIS Desenvolvido pelo Mestrando Rodrigo Moreira Barreto – VHLab (Virtual Humans Simulation Laboratory – PUCRS) 1 Desenvolvido por: Rodrigo Moreira.
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Aula prática 7 Strings Monitoria de Introdução à Programação.
©André Santos, Programação Funcional André Santos.
C suporta algumas Constantes de caráteres especiais de barra invertida (backslash) que são usados em funções de saída. Constantes de caráteres especiais.
Prof. Tertuliano Operadores Variáveis em C++.
Variáveis, expressões e comandos Dilvan Moreira. Lembrando …  Instalação normal (para utilizar no PC com Windows) 
Lógica de Programação Aula 06 Prof. Marcelo Marcony.
Programação Funcional
Transcrição da apresentação:

Programação Funcional Padrões Simples e Definição de Operadores em Haskell 3a. Seção de Slides

Hoje: Alguns comentários e respostas das aulas passadas Operadores, associatividade Padrões e casamentos Tipos Bool, Carácteres e String e Float

Obs. do Lab #2 Seja calcular: 7^0 + 7^1 + ... + 7^n Logo uma função de 7^n é dada por: pot_7 0 = 1 pot_7 n = 7 * pot_7 (n-1) Aplicar uma recursão sobre: 7^0 + 7^1 + ... + 7^n Então: serie_7 pot_7 0 = pot_7 0 serie_7 pot_7 n = pot_7 n + serie_7 pot_7 (n-1) Aula02> pot_7 2 49 Aula02> serie_7 pot_7 2 57 Aula02> :type serie_7 serie_7 :: (Num a, Num b) => (b -> a) -> b -> a

Correções na Apostila --Correção na apostila do Michell -- função ... SOMA ESPECIAL s_michell f 1 = 1 s_michell f n = f n + s_michell f (n-1) (página 11, no final) f x | x == 0 = 10 | x < 0 = abs (x) | x > 0 = x - f (x-1) Faltava também definir f ....

Perguntas: write :: String -> String write x = x Main> write "xxxx yyyy" "xxxx yyyy" Main> write xxxx yyyy ERROR - Undefined variable "yyyy" Main>

Um pouco sobre entradas/saídas: .... putStrLn “Alo mundo” nome_string <- getLine -- Não usa o igual... pois não é uma -- função

Comentários: Obs. No uso de parênteses.... são necessários ou_excl False False = False ou_excl True True = False ou_excl _ _ = True Main> ou_excl True False True Main> ou_excl (4 > 6) (3 < 8) Obs. No uso de parênteses.... são necessários

Operadores Como visto: a linguagem Haskell contém vários operadores, como: +, -, *, /, `div`, `mod`, ^, etc. Operadores são infixos, o que significa que são escritos entre os seus argumentos. Parênteses podem ser usados em qualquer operação: (((4+8)*3)+2) Propriedades que auxiliam na eliminação de parênteses: associatividade e prioridade de operadores.

Associatividade Uma operação op é associativa se (x op y) op z = x op (y op z) Operações associativas dispensam parênteses. Ou seja, não interessa a ordem de como os cálculos são feitos. Uma operação não associativa é classificada como: associativa à esquerda; ou associativa à direita.

Associatividade Adição (+) é associativa. Main> 4 + 2 + 1 7 Main> (4 - 2) - 1 1 Main> 4 - (2 - 1) 3 Main> 4 - 2 - 1 Prelude> 9-(7+2) Prelude> (9-7)+2 4 Prelude> 9-7+2 Subtração (-) é associativa à esquerda. Subtração (-) não é associativa. Finalmente, na mistura, a associativa à esquerda

Precedência de operadores A associatividade define a ordem de computação de expressões envolvendo mais de uma ocorrência de um mesmo operador. Ex: 2^3^2 Prelude> 2^3^2 512 Prelude> 2^9 E quando operadores diferentes são utilizados? Por exemplo: 2+3*4 = 14 3^4*2 = 162 Alguns operadores têm precedência maior do que outros. Exponenciação é associativa à direita.

Precedência de operadores Operador * tem precedência 7, enquanto + tem prioridade 6. Main> 2 + 3 * 4 14 Main> 2 ^ 3 * 4 32 Operador ^ tem precedência 8.

Precedência de operadores Main> 2 + 3 * 4 14 Main> 2 ^ 3 * 4 32 Main> fat 4 + 1 ??????????????????? 1 fat :: Int -> Int 2 fat n 3 | n <= 0 = 1 4 | otherwise = n * fat (n-1)

Precedência de operadores Main> 2 + 3 * 4 14 Main> 2 ^ 3 * 4 32 Main> fat 4 + 1 25 Aplicação de função tem precedência máxima. Tabela de associatividade e precedências pode ser encontrada no Apêndice E do livro-texto. 1 fat :: Int -> Int 2 fat n 3 | n <= 0 = 1 4 | otherwise = n * fat (n-1)

Precedência de operadores Main> fat (-1) 1 1 fat :: Int -> Int 2 fat n 3 | n <= 0 = 1 4 | otherwise = n * fat (n-1)

Precedência de operadores Main> fat (-1) Main> fat -1 ERROR - Illegal class constraint in inferred type 1 fat :: Int -> Int 2 fat n 3 | n <= 0 = 1 4 | otherwise = n * fat (n-1)

Definindo Operadores Haskell permite a definição de novos operadores. Os nomes dos operadores são formados por: ! # $ % & * + . / < = > ? @ \ ^ | : - ~ Restrições: nomes não podem começar por ":" "-" e "~" só podem ser o primeiro símbolo do nome símbolos (e combinações) reservados: :: => = @ \ | ^ <- -> Mudar associatividade ou precedência: infix infixl infixr Define operador como não associativo. Define operador como associativo à esquerda. Define operador como associativo à direita.

Define operador &&& como associativo à esquerda, com predência 7. Definindo Operadores 1 infixl 7 &&& Define operador &&& como associativo à esquerda, com predência 7.

Definindo Operadores Main> 10 &&& 20 20 1 infixl 7 &&& 2 3 (&&&) :: Int -> Int -> Int 4 a &&& b 5 | a > b = a 6 | otherwise = b Main> 10 &&& 20 20

Definições com Padrões As definições de funções vistas até agora consistem de uma única equação. É possível definir uma função usando várias equações. As equações devem especificar como a função se comporta quando aplicada a determinados padrões. Os padrões mais simples são variáveis e constantes.

Definições com Padrões Versão anterior - uma equação condicional: 1 totalSales :: Int -> Int 2 totalSales n 3 | n == 0 = sales 0 4 | otherwise = totalSales (n-1) + (sales n) Nova versão - usando padrões (“pattern matching”): 1 . 2 . totalSales 0 = sales 0 totalSales n = totalSales (n-1) + (sales n)

Definições com Padrões 1 . 2 . totalSales 0 = sales 0 totalSales n = totalSales (n-1) + (sales n) A primeira equação é aplicada somente ao valor 0. A segunda se aplica a todos os outros casos. Regra geral: utilizar a primeira equação que "casa" com os argumentos, na ordem especificada. Um argumento a casa com um padrão p se: p é uma constante e a é igual a p ; ou p é uma variável.

Definições com Padrões O padrão "_" casa com qualquer argumento (“Prolog like”). É usado quando o valor do argumento não é necessário no lado direito da equação. 1 . 2 . 3 . is Zero :: Int -> Bool isZero 0 = True isZero _ = False

Definições com Padrões Exemplo envolvendo padrões e equação condicional: 1 . 2 . 3 . 4 . 5 . 6 . 7 . fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib n | n > 1 = fib (n-1) + fib (n-2) | otherwise = 0

Programando com Booleanos Os valores booleanos são representados pelas constantes False e True, do tipo Bool. Operadores: && ("e" lógico) || ("ou" lógico) not (negação) Semântica dos operadores: t1 t2 t1 && t2 t1 || t2 t1 not t1 T T T T T F T F F T F T F T F T F F F F

Programando com Booleanos Uma definição para "not": 1 . 2 . 3 . meuNot :: Bool -> Bool meuNot True = False meuNot False = True

Programando com Booleanos "ou exclusivo" - retorna True se exatamente um dos argumentos for True: exOr :: Bool -> Bool -> Bool exOr x y = (x || y) && not (x && y) (Veio da definição do Ou-exclusivo... Lógica) Definição usando padrões: 1 . 2 . exOr False x = x exOr True x = not x

Programando com Booleanos Construir uma função isZeroDay que, dado o número de um dia, retorne: True, se o número de unidades vendidas (função sales) no dia é zero; False, caso contrário. 1 . 2 . 3 . 4 . isZeroDay :: Int -> Bool isZeroDay n | sales n == 0 = True | otherwise = False

Programando com Booleanos 1 . 2 . 3 . 4 . isZeroDay :: Int -> Bool isZeroDay n | sales n == 0 = True | otherwise = False Quando a expressão sales n == 0 tem valor True, a função retorna True. Quando a expressão sales n == 0 tem valor False, a função retorna False.

Programando com Booleanos 1 . 2 . 3 . 4 . isZeroDay :: Int -> Bool isZeroDay n | sales n == 0 = True | otherwise = False Esta função será reusada em seguida.... Simplificação: 1 . 2 . isZeroDay :: Int -> Bool isZeroDay n = (sales n == 0) Ao invés do True ou False... A própria expressão! Humm bem elegante...

Programando com Booleanos Construir uma função zeroInPeriod que, dado o número de um dia, retorne: True, se não foi vendida nenhuma unidade do produto em algum dia do período 0,...,n; False, caso contrário. 1 . 2 . 3 . 4 . zeroInPeriod :: Int -> Bool zeroInPeriod 0 = isZeroDay 0 zeroInPeriod n = ????????????????

Programando com Booleanos 1 . 2 . 3 . 4 . zeroInPeriod :: Int -> Bool zeroInPeriod 0 = isZeroDay 0 zeroInPeriod n = sales 0 sales 1 ... sales (n-1) sales n zeroInPeriod (n-1) isZeroDay n

Programando com Booleanos 1 . 2 . 3 . 4 . zeroInPeriod :: Int -> Bool zeroInPeriod 0 = isZeroDay 0 zeroInPeriod n = zeroInPeriod (n-1) || isZeroDay n sales 0 sales 1 ... sales (n-1) sales n zeroInPeriod = zeroInPeriod (n-1) || isZeroDay n

Caracteres e Strings Char : tipo de Haskell associado a caracteres. Caracteres individuais são inseridos em aspas simples. Exemplos: ´d´, ´3´. Caracteres especiais: ´\t´ tab ´\n´ new line ´\\´ barra invertida ´\´´ aspa simples ´\"´ aspa dupla ´\97´ caractere ´a´

Caracteres e Strings Haskell utiliza a codificação padrão ASCII para caracteres. As funções chr e ord são usadas para conversões. Main> chr 97 ´a´ Main> ord ´A´ 65

Caracteres e Strings Conversão de letra minúscula para maiúscula: 1 . 2 . 3 . 4 . offset = ord ´A´ - ord ´a´ capitalize :: Char -> Char capitalize ch = chr (ord ch + offset) Verificar se um caractere é um dígito: 1 . 2 . isDigit :: Char -> Bool isDigit ch = (´0´<= ch) && (ch <= ´9´)

Caracteres e Strings Strings de caracteres pertencem ao tipo String. São inseridas entre aspas duplas. Exemplos: "abcdef" "uma linha\noutra linha" "" "O caractere \´a\´ : \97" Strings são concatenadas usando o operador ++ Ex: “alo, ” ++ “ bom “ ++ “ dia “

Caracteres e Strings Haskell permite que novos tipos sejam criados, usando a palavra-chave type. O tipo String é, na realidade, uma lista de caracteres: type String = [Char] As operações que manipulam listas (duas aulas a frente) podem ser usadas também para strings. Como no Prolog: “[“ .... “]” (colchetes)... são usados para especificar uma lista, no caso: “uma string é uma lista de carácteres”

Números de Ponto Flutuante Números de ponto flutuante são representados, em Haskell, pelos tipos Float e Double. Exemplos: 3.141592 -1.2345 987.654 Haskell usa também notação científica: 9.87654e02 = 9.87654*10 = 987.654 31415.92e-4 = 31415.92*10 = 3.141592 2 -4

Números de Ponto Flutuante Haskell oferece uma série de funções que atuam sobre números de ponto flutuante. Main> sin (pi/2) 1.0 Main> 1.1 ^ 10 2.59374 Main> 1.1 ** 10.0 Main> 2.5**(3.5) 24.7053 Main> sqrt 2 1.41421

Números de Ponto Flutuante Main> round 2.49 2 Main> ceiling 2.49 3 Main> floor 2.49 Main> log 2 0.693147 main> logBase 2 16 4.0