©André Santos, 1998-2002 Programação Funcional André Santos.

Slides:



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

Departamento de Informática Universidade Federal do Espírito Santo
Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekoken 2010/1.
Funções em C Prof. Fabiano Utiyama.
Python: Funções Claudio Esperança.
Curso de aprofundamento na linguagem C
Paulo Marques Hernâni Pedroso
Programação Funcional
Introdução à Programação: uma Abordagem Funcional PD I – Engenharia Elétrica Prof.ª Claudia Boeres 2008/2.
Departamento de Informática Universidade Federal do Espírito Santo
Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 34 Departamento de Informática Centro.
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)
Programação para Engenharia I
Introdução a Programação Renata Freire
Programação Básica em Java
Rafael Pinto Frederico Corrêa
Paradigmas da Programação
Vetores, Matrizes e Funções
INTRODUÇÃ A COMPUTAÇÃO ENG. CIVIL
Linguagem Haskell Riocemar S. de Santana.
CAPÍTULO 05 Listas.
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.
Haskell.
Programação Funcional
Programação Funcional
Haskell Programação Funcional
©André Santos, Programação Funcional Generalizações André Santos.
Estudo dos Conceitos e Paradigmas de Programação
©André Santos, Programação Funcional Classes em Haskell André Santos.
Expressões e Instrução de Atribuição
Tópicos Avançados em Linguagens Computacionais – IF724
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:
Paradigma Funcional Apresentação de LF1.
Centro de Informática – UFPE
© André Santos Programação Funcional Listas André Santos.
Programação em C++ Compiladores
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;
Paradigmas de Linguagens de Programação Aula 2
3. Introdução à Linguagem C
Uso de parâmetros na linha de comando. Parâmetros da função main:
Algumas notas sobre a linguagem de programação C
Aula Prática 3 Funções Monitoria Introdução à Programação.
Programação Funcional
JAVA Sintaxe.
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
George Darmiton da Cunha Cavalcanti
Linguagens Funcionais: Haskell Prática 1 Paradigmas de Linguagens Computacionais Monitor: Guilherme Moura
Aula Prática 3 Funções Monitoria Introdução à Programação.
Generalizações: Map, Fold, Filter, e Composição ©André Santos e Marcelo d’Amorim 2010.
Funções como Valor ©André Santos e Marcelo d’Amorim.
Haskell Programação Funcional Diego Lima Rubem Moreira.
Departamento de Informática Universidade Federal do Espírito Santo
©André Santos, Programação Funcional Tipos Algébricos André Santos.
©André Santos, Programação Funcional Provas de Propriedades de Programas André Santos.
©André Santos, Programação Funcional Tipos Abstratos de Dados André Santos.
©André Santos, Programação Funcional Funções como valores André Santos.
Haskell Programação Funcional Diego Lima Rubem Moreira.
BCC101 – Matemática Discreta
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.
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
 O que são arrays:  estruturas de dados homogêneas  coleção de elementos do mesmo tipo referenciada por um nome comum  um array pode ser imaginado.
Tipos de Dados, Variáveis, Expressões Lógicas e Aritméticas
11 Revisão da Linguagem C Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
Haskell (é uma função polimorfica) Laboratório Rafael Borges
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Estrutura de Dados Prof. André Cypriano M. Costa
Variáveis, expressões e comandos Dilvan Moreira. Lembrando …  Instalação normal (para utilizar no PC com Windows) 
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Programação Funcional
Transcrição da apresentação:

©André Santos, Programação Funcional André Santos

©André Santos, O que é Programação Funcional? Programação com alto nível de abstração Soluções elegantes, concisas e poderosas Funções: computam um resultado que depende apenas dos valores das entradas Forte fundamentação teórica, o que permite mais facilmente provas de propriedades sobre os programas

©André Santos, Por que um curso de programação funcional? Dá uma visão clara de conceitos fundamentais da computação moderna: –abstração (em uma função) –abstração de dados (tipos abstratos de dados) –genericidade, polimorfismo, overloading

©André Santos, Conceitos importantes Sistema de tipos fortes Uso extensivo de recursão Polimorfismo e funções de alta ordem Tipos de dados algébricos Coleta de lixo (Garbage Collection)

©André Santos, Objetivos da programação funcional Programação com um alto nível de abstração, possibilitando: –alta produtividade –programas mais concisos –programas mais fáceis de entender –menos erros –provas de propriedades sobre programas

©André Santos, Uso prático Programas com milhares de linhas de código: compiladores, provadores de teoremas etc. Ericsson utiliza Erlang, uma linguagem funcional concorrente, para programação de switches de redes/telecomunicações, com excelentes resultados. Possibilidade de integração com partes de programas escritos em outras linguagens.

©André Santos, Ambiente a ser utilizado no curso Linguagem de programação: Haskell Interpretador Hugs: disponível para Windows e Unix, gratuito Compilador GHC também está disponível gratuitamente para Windows e Unix (versão do compilador para Unix instalada nos Labs)

©André Santos, Notação: Programação baseada em definições answer :: Int answer = 42 greater :: Bool greater = (answer > 71) yes :: Bool yes = True

©André Santos, Definição de Funções square :: Int -> Int square x = x * x allEqual :: Int -> Int -> Int -> Bool allEqual n m p = (n == m) && (m == p) maxi :: Int -> Int -> Int maxi n m | n >= m = n | otherwise = m

©André Santos, Avaliando Expressões Encontrar o valor de uma expressão Usar definições das funções addD :: Int -> Int -> Int addD a b = 2 * (a+b) addD 2 (addD 3 4) = 2 * (2 + (addD 3 4)) = 2 * (2 + 2 * (3 + 4)) = 32

©André Santos, Exemplo: addD a b = 2 * (a+b) = 2 * (b+a) = addD b a Válida para quaisquer argumentos a e b Não seria válida em linguagens imperativas, com variáveis globais. Prova de propriedades

©André Santos, Em uma linguagem imperativa... int b;... int f (int x) { b = x; return (5) } addD (f 3) b == addD b (f 3) ?

©André Santos, Exercícios Defina as seguintes funções: –fatorial fat :: Int -> Int –compara se quatro números são iguais all4Equal :: Int -> Int -> Int -> Int -> Bool –all4Equal usando allEqual –retorna quantos parâmetros são iguais howManyEqual :: Int -> Int -> Int -> Int

©André Santos, Tipos Básicos Inteiros  1,2,3,...:: Int  +, *, -, div, mod :: Int -> Int -> Int  >, >=, ==, /=, Int -> Bool Booleanos  True, False :: Bool  &&, || :: Bool -> Bool -> Bool  not :: Bool -> Bool

©André Santos, Exemplo suponha vendas semanais dadas pela função sales :: Int -> Int total de vendas da semana 0 à semana n? totalSales :: Int -> Int sales 0 + sales sales (n-1) + sales n totalSales n | n == 0 = sales 0 | otherwise = totalSales (n-1) + sales n

©André Santos, Recursão Definir caso base, i.e. valor para fun 0 Definir o valor para fun n usando o valor de fun (n-1) Este é o caso recursivo. maxSales :: Int -> Int maxSales n | n == 0 = sales 0 | otherwise = maxi (maxSales (n-1)) (sales n)

©André Santos, Casamento de Padrões Permite usar padrões no lugar de variáveis, na definição de funções: maxSales :: Int -> Int maxSales 0 = sales 0 maxSales n = maxi (maxSales (n-1))(sales n) totalSales :: Int -> Int totalSales 0 = sales 0 totalSales n = totalSales (n-1) + sales n

©André Santos, Casamento de Padrões myNot :: Bool -> Bool myNot True = False myNot False = True myOr :: Bool -> Bool -> Bool myOr True x = True myOr False x = x myAnd :: Bool -> Bool -> Bool myAnd False x = False myAnd True x = x

©André Santos, Exercícios Defina uma função que dado um valor inteiro s e um número de semanas n retorna quantas semanas de 0 a n tiveram venda igual a s.

©André Santos, Caracteres e Strings ’a’,’b’,...:: Char ’\t’, ’\n’, ’\\’, ’\’’, ’\”’ :: Char ”abc”, ”andre” :: String ord :: Char -> Int chr :: Int -> Char ++ :: String -> String -> String ”abc” ++ ”def” ’ ’, ”” e ” ” são diferentes!

©André Santos, Caracteres e Strings offset :: Int offset = ord ’A’ - ord ’a’ capitalize :: Char -> Char capitalize ch = chr (ord ch + offset) isDigit :: Char -> Bool isDigit ch = (ch >= ’0’) && (ch <= ’9’)

©André Santos, Exercícios Defina a função makeSpaces :: Int -> String que produz um string com uma quantidade n de espaços Defina pushRight :: Int -> String -> String, utilizando a definição de makeSpaces, para adicionar uma quantidade n de espaços a um dado string.

©André Santos, Ponto Flutuante Float e Double :: Float +,-,*,/ :: Float -> Float -> Float pi :: Float ceiling, floor, round :: Float -> Int fromInt :: Int -> Float

©André Santos, Exercícios Defina a função averageSales :: Int -> Float que dado um número de semanas n, retorna a média de vendas das semanas de 0 a n.

©André Santos, Estruturas de dados - Tuplas intP :: (Int, Int) intP = (33,43) (True, ’x’) :: (Bool, Char) (34, 22,’b’) :: (Int, Int, Char) addPair :: (Int,Int) -> Int addPair (x,y) = x+y shift :: ((Int,Int),Int) -> (Int,(Int,Int)) shift ((x,y),z) = (x,(y,z))

©André Santos, Sinônimos de Tipos type Name = String type Age = Int type Phone = Int type Person = (Name, Age, Phone) name :: Person -> Name name (n,a,p) = n

©André Santos, Definições Locais Estilo bottom-up ou top-down sumSquares :: Int -> Int -> Int sumSquares x y = sqX + sqY where sqX = x * x sqY = y * y sumSquares x y = sq x + sq y where sq z = z * z sumSquares x y = let sqX = x * x sqY = y * y in sqX + sqY

©André Santos, Definições Locais maxThreeOccurs :: Int -> Int -> Int -> (Int,Int) maxThreeOccurs m n p = (mx, eqCount) where mx = maxiThree m n p eqCount = equalCount mx m n p... let definições in expressão definições where definições

©André Santos, Exemplo Week Sales Total 52 Average printTable :: Int -> String printTable n = heading ++ printWeeks n ++ printTotal n ++ printAverage n

©André Santos, Notação Maiúsculas: Tipos e Construtores Minúsculas: funções e argumentos case sensitive comentários: -- isto e’ um comentario de uma linha {- comentario de varias linhas... -}

©André Santos, Notação f n + 1 f (n + 1) (+) 3 2 maxi ‘maxi‘ 4

©André Santos, Erros comuns square x = x *x answer = 42; newline = ’\n’ funny x = x + 1 Error! Unexpected ’;’ Funny x = x+1 Error! Undefined constructor ’Funny’

©André Santos, Exemplo: equações de segundo grau a*X² + b*X + c = 0.0 duas raízes, se b² > 4.0*a*c uma raiz, se b² == 4.0*a*c não tem raízes, se b² < 4.0*a*c The quadratic equation 1.0*X^ *X = 0.0 has two roots: (-b ± sqrt(b²-4ac))/2a

©André Santos, Resolução bottom-up Definir as funções auxiliares oneRoot :: Float -> Float -> Float -> Float oneRoot a b c = -b/(2.0*a) twoRoots :: Float -> Float -> Float -> (Float, Float) twoRoots a b c = (d-e, d+e) where d = -b/(2.0*a) e = sqrt(b^2-4.0*a*c)/(2.0*a)

©André Santos, Definir a função principal roots :: Float -> Float -> Float -> String roots a b c | b^2 == 4.0*a*c = show (oneRoot a b c) | b^2 > 4.0*a*c = show f ++ “ ” ++show s | otherwise = “no roots” where (f,s) = twoRoots a b c ou f = fst(twoRoots a b c) s = snd(twoRoots a b c) Resolução bottom-up