Você está na página 1de 35

PLP

Aula 16 - Programação Funcional


Curso: Ciência da Computação
Departamento: Centro de Ciência e Tecnologia
Professor: Jheymesson A. Cavalcanti

Slides Originais do Professor Waldemar Neto


Sumário
• Introdução

• Programação funcional

• Linguagens funcionais

• Haskell

– Casamento de padrões

– Funções de ordem superior

– Avaliação preguiçosa (lazy evaluation)

• Resumo
Introdução
Introdução • Programação funcional é
baseada no conceito de funções
matemáticas

• Uma função matemática é um


mapeamento de membros de
um conjunto (domínio) em
outro conjunto (imagem)

• A ordem de avaliação é controlada por

○ recursões e expressões condicionais

○ ao invés de sequenciamento e iterações

• Não possuem efeito colateral


Uma Simples Função

• Exemplo: função cubo

cubo(x) = x * x * x

– Domínio: conjunto dos números reais

– x: pode representar qualquer elemento do domínio, mas é


fixo para representar apenas um elemento na avaliação
• Forma funcional ou função de
ordem superior

– Aceita funções como parâmetros

– Aceita funções como retorno

• Composição de funções (h = f ° g)

Formas Funcionais – Exemplo

f(x) = x + 2

g(x) = x* x

h(x) = f(g(x))

= (3 * x) + 2
PROGRAMAÇÃO FUNCIONAL
Programação Funcional
• Um programa no paradigma funcional é uma função, o qual pode ser
uma composição de outras funções

P ≡ f (x1, x2, ..., xn)

≡ f1 ° f2 ° ... ° fn (x1, x2, ..., xn)

• O objetivo da programação é imitar uma função matemática

• Programação funcional é baseada no modelo computacional Lambda


Calculus (Church, 1941)

– Exemplo: ((λ x. (λ y. x)) (λ z. z)) (λ a. a)


Programação Funcional vs.
Imperativa
• Exemplo de avaliação de (x + y) / (a – b)
Programação imperativa
• Avalia (x + y) e armazena resultado na memória
• Avalia (a – b) e armazena resultado na memória
• Carrega ambos valores da memória e faz a divisão

Alan Turing
Programação funcional
• Não usam variáveis como endereços de memória
• Usam recursão ao invés de iterações
• Não possuem efeitos colaterais – dados os mesmos
parâmetros sempre dará o mesmo resultado
Alonzo Church (transparência referencial)
Exemplo

• Algoritmo de Euclides para cálculo do máximo divisor comum


(MDC)

mdc :: Int -> Int -> Int -- declaração da função mdc


mdc m n -- definição da função
| m == 0 = n
| m > 0 = mdc (n `mod` m) m

http://haskell.org
LINGUAGENS FUNCIONAIS
Linguagens ● Algumas linguagens funcionais famosas
Funcionais ○ LISP ( John McCarthy , 1960)

■ Escopo dinâmico e coleta de lixo

■ Diversas extensões: CLOS, Scheme, etc

■ Principal uso: inteligência artificial

○ APL ( Kenneth Iverson, 1962)

■ Não é puramente funcional (possui atribuição)

■ Principal tipo de dados: matrizes

■ Principal uso: avaliação de expressões


Linguagens Funcionais ● Algumas linguagens funcionais famosas

● ML (Robin Milner, 1979)

○ Polimorfismo e sistema de tipos forte

○ Modularização e suporte a TAD

○ Não é puramente funcional

● Miranda (David Turner, 1986)

○ Similar a ML, porém com avaliação lazy

● Haskell (S. Peyton Jones & P. Wadler,


1992)

○ Puramente funcional

○ Avaliação lazy
Principais • LISP

Aplicações – Diversas aplicações em IA

– Emacs (editor de textos)

– Macsyma (cálculos simbólicos)

• Haskell

– Compilador GHC

• ML

– Servidor Web, provadores de teorema


Haskell
Haskell
• Algumas propriedades de Haskell

– Sintaxe similar a ML

– Estaticamente e fortemente tipada

– Puramente funcional

• Não possui variáveis

• Nem outras características imperativas

– Possui avaliação preguiçosa (lazy evaluation)

– Permite definir listas infinitas


Exemplo

• Exemplo de função fatorial


fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact (n-1)

• Mesmo exemplo escrito com uma sintaxe


alternativa
fact :: Integer -> Integer
fact n
| n == 0 = 1
| n > 0 = n * fact (n-1)
Conceitos Fundamentais

• Conceitos fundamentais de
Haskell

Casamento Avaliação
de Padrões Preguiçosa
Funções de
ordem superior
Casamento de
Padrões
• Função definida por várias equações, cada uma com um padrão
no seu lado esquerdo
fib :: Int -> Int
fib 0 = 0 -- equação aplicada ao caso 0
fib 1 = 1 -- equação aplicada ao caso 1
fib n = fib (n-1) + fib (n-2) -- equação aplicada nos outros casos

• Vantagens
– Concisão e clareza
– Mais próxima de uma definição matemática
Casamento de
Padrões
• Forma tradicional para definição de funções via uma única
equação (possivelmente condicional)

soma :: Int -> Int


soma n
-- se n menor ou igual a zero
| n <= 0 = 0
-- se n maior que zero
| n > 0 = n + soma
(n-1)
Cláusula otherwise

• Casamento de padrão com opção padrão (otherwise)

fun :: Int -> Int


fun n
| n < 10 = 0
| n > 10 = 2
| otherwise = 1
Cláusula where

• Cálcular o quadro de um parâmetro, enquanto calcula-se o


produto de outro

• Implementação em Haskell
fun :: (Float, Float) -> (Float, Float)
fun (a,b) = (x1, x2) where
x1 = a * a
x2 = b * b * b

main = print (fun (2, 4))


Listas

• Declaração de listas entre colchetes


colors :: [String]
colors = [ "blue", "green", "red" ]

● Operadores
● Concatenação (++)
○ [1, 3, 5] ++ [2, 4, 6] -> [1, 3, 5, 2, 4, 6]
● – Infixo de lista (:)
○ 5:[2, 7, 9] -> [5, 2, 7, 9]
● Séries aritméticas (..)
○ [1, 3..11] -> [1, 3, 5, 7, 9, 11]
● Tamanho de lista (length)
○ length [2, 4, 6] -> 3
Exemplos

• Operações com lista


– Soma de todos os elementos de uma lista de inteiros

somatorio :: [Int] -> Int


somatorio [] = 0
somatorio (a:x) = a + somatorio x

– Produto de todos os elementos de uma lista de inteiros

produtorio :: [Int] -> Int


produtorio [] = 1
produtorio (a:x) = a * produtorio x
– Fatorial de um número inteiro
fact :: Int -> Int
fact n = produtorio [1..n]
Compreensão de Listas

• Descrição de listas que representam conjuntos


[corpo | qualificadores ]

• Exemplos
– Cubo dos números de 1 a 50
cubo :: [Int]
cubo = [ n * n * n | n <- [1..50] ]
Simplicidade

• Exemplo do algoritmo Quicksort em


Haskell
qsort :: [Int] -> [Int]
qsort [] = []
qsort (a:x) = qsort [ b | b <- x, b <= a ]
++ [a] ++
qsort [ b | b <- x, b > a ]
Funções de • Formas funcionais
Ordem – Funções de primeira ordem

Superior • Parâmetros e resultado não são funções

– Funções de ordem superior

• Possui parâmetros e/ou retornos que são funções

• Linguagens funcionais

– Funções são valores de primeira classe

– Conceito comum na matemática (derivada, integral, ...)


Exemplo

• Funções de primeira ordem

impar :: Int -> Bool quad :: Int -> Int


impar x quad x = x ^ 2
| (x `mod` 2) == 1 = True
| otherwise = False
• Função de ordem superior
> nmap quad [1,2,3,4]
nmap :: (t -> u) -> [t] -> [u] [1,4,9,16]
nmap f [] = []
> nmap impar [1,2,3,4]
nmap f (a:x) = f a : nmap f x
[True,False,True,False]
Avaliação
Preguiçosa
• Avaliação preguiçosa ou avaliação tardia: argumentos somente
são avaliados quando são utilizados
• Permite que uma função retorne resultados parcialmente
avaliados
• Conceito útil para construir listas infinitas
positivos :: [Integer]
positivos = [0..]

pares :: [Integer]
pares = [0, 2..]

quadrados :: [Integer]
Exemplo

• Verificar se um elemento existe na lista


quadrado

membro :: [Integer] -> Integer -> Bool > membro quadrados 15


membro [] b = False True
membro (a:x) b = (a == b) || membro x b

Qual o problema?
Exemplo

• Reescrevendo o exemplo anterior para consertar o


problema

membro2 :: [Integer] -> Integer -> Bool > membro2 quadrados 16


membro2 [] n = False True
membro2 (m:x) n > membro2 quadrados 15
| m < n = membro2 x n False
| m == n = True
| otherwise = False
Avaliação Preguiçosa
• Vantagens

– Maior poder de expressividade

• Desvantagens

– Semântica complicada

– Execução mais lenta


Resumo
Comparação • Linguagens imperativas são mais eficientes

Funcional vs. – Modelo computacional de von Neumann: mesmo


modelo das atuais arquiteturas de computadores
Imperativo
• Linguagens funcionais possuem construções
com um nível de abstração maior

– Útil para prototipação

• Linguagens funcionais viabilizam provas formais de


propriedades de programas
Email
jheymesson.cavalcanti@unicap.br

Obrigado
CREDITS: This presentation template was created by Slidesgo,
including icons by Flaticon, and infographics & images by Freepik

Você também pode gostar