Escolar Documentos
Profissional Documentos
Cultura Documentos
Funcional
Funcional
Eduardo Feitosa
efeitosa@icomp.ufam.edu.br
Material de Referência
*
Paradigmas Imperativos
*
**
Paradigmas Imperativos
*
**
***
Paradigmas Imperativos
*
**
***
****
Paradigmas Imperativos
*
**
***
****
*****
Paradigmas Imperativos
*
**
***
****
*****
******
Paradigma Imperativo
● Características
○ Programas são coleções de funções e de aplicações
dessas funções (chamadas)
○ Algoritmos descrevem o quê o programa deve realizar,
não como
○ Não existe estado
Funções Matemáticas
● Funções simples
○ Definição de função: 𝑐𝑢𝑏𝑜 𝑥 = 𝑥 ∗ 𝑥 ∗ 𝑥
○ Aplicação de função: cubo(8)
● Formas funcionais
○ Uma função de alta ordem, ou forma funcional, é aquela
que toma funções como parâmetro, produz uma função
como resultado, ou ambos
● Composição de funções
○ Toma duas funções como parâmetro e define uma função
cujo o valor é a primeira função aplicada ao resultado da
segunda
○ h ≡ 𝑓 ∘ 𝑔, h(x) ≡ 𝑓(𝑔(𝑥))
Funções Matemáticas
● Forma: 𝛼
○ h(𝑥) ≡ 𝑥 ∗ 𝑥
○ α(h, (2, 3, 4)) 𝑟𝑒𝑠𝑢𝑙𝑡𝑎 (4, 9, 16)
Fundamentos das Linguagens
Funcionais
● O objetivo do projeto LPF é imitar funções
matemáticas no maior grau possível
; Tipos de dados
> 1 ; inteiro
3.14
1/5
LISP
; Uma lista (NOME ARG1 ARG2 ARG3 ... ARGN) é uma chamada de função
> (+ 1 2)
> (+ 1 2 3 4 5 6)
15
> (- 3 2 1)
> (* 2 3 4 5)
120
LISP
2/3
5/3
11/3
11/3
LISP
1/6
> (/ 2.0 3)
0.666666666
> (/ 2.0 3 4)
0.166666667
LISP
14
> (* (+ 2 3) 4) ; (2 + 3) * 4
20
> (/ 2.0 3)
0.666666666
> (/ 2.0 3 4)
0.166666667
LISP
(1 2 3 4)
(1 (2 3) 4)
NIL
LISP
> (FIRST 1)
; erro
LISP
(2 3 4)
((2 3) 4)
(2)
NIL
LISP
NIL
Scheme
● Fatorial
(define fatorial
(lambda (n)
(if (= n 0)
1
(* n (fatorial (- n 1))))))
Scheme
● Fatorial
(define pertence?
(lambda (el conj)
(if (null? conj)
'#f
(if (= (car conj) el)
'#t (pertence? el (cdr conj))))))
Haskell
● É fortemente tipada
● Fatorial
fatorial :: Int -> Int
fatorial 0 = 1
fatorial n = fatorial (n-1) * n
OU
fatorial n
| n == 0 = 1
| otherwise = fatorial (n-1) * n
OU
fatorial n = if n == 0 then 1
else fatorial (n-1) * n
Linguagens Funcionais
● Princípios norteantes
○ Uma função é um mapeamento da entrada para uma
saída única
A B A B
● Princípios norteantes
○ Uma função é um mapeamento da entrada para uma
saída única
■ O resultado de uma função depende exclusivamente dos
argumentos
■ Efeitos colaterais inexistentes ou restritos
■ Uma função chamada duas vezes com os mesmos argumentos
deve retornar o mesmo valor
Python funcional
● Princípios norteantes
○ A recursão substitui a iteração
■ Característica marcante do paradigma
○ Manipulação de coleções
■ Listas
■ Tuplas (listas imutáveis)
■ Dicionários
■ Conjuntos
Python funcional
● Princípios norteantes
○ Sem efeitos colaterais
○ Estritamente, sem atribuições
○ Exceção: em alguns casos, variáveis locais
○ Mas as funções não podem compartilhar estados!
■ Uma função não pode alterar um objeto
■ Não utilizamos variáveis globais
Python funcional
● Exemplos
○ Cálculo do fatorial
○ Funções CAR e CDR ou head() e tail()
○ Somar todos os elementos de uma lista
○ Testar se uma lista contém um elemento
○ Selecionar todos os números pares de uma lista
○ Encontrar o menor valor de uma lista
Python funcional
● Aceitável
def menor(L):
if len(L) == 1:
return L[0]
else:
menor_resto = menor(L[1:])
if L[0] < menor_resto:
return L[0]
else:
return menor_resto
Python funcional
● Não aceitável
def menor(L):
res = L[0]
for x in L:
if x < res:
res = x
return res
Python funcional
● Melhor
>>> escreve("abc")
abc
Funções em Python
● Funções lambda
<lambda> ::= "lambda" [ <parâmetros> ] : <expressão>
>>> quad(6)
36
Funções em Python
● filter(função, lista)
○ Faz com que a função atue como um filtro sobre os
elementos da lista
○ Os elementos que são mapeados para um valor falso são
filtrados (removidos)
def par(x):
return x % 2 == 0
Resultado: [2, 4, 6]
Map
● map(função, lista)
○ Utiliza uma função para transformar cada elemento da lista
○ Retorna uma nova lista com cada elemento mapeado por
meio da função
def quadrado(x):
return x ** 2
● reduce(função, lista)
○ A função deve ter dois parâmetros: um acumulador e um
elemento da lista
○ Inicialmente, o acumulador é o primeiro elemento da lista
■ Então o valor mapeado pela função se torna o acumulador para
o próximo elemento
Resultado: 21
Funções de ordem mais alta e lambda
● Número primo
○ n é primo se ¬∃k ∈ [2, n[ | n ≡ 0 (mod k)
>>> primo(2)
True
>>> primo(5)
True
>>> primo(8)
False
Geradores e Avaliação
Preguiçosa
Avaliação Preguiçosa
>>> op1 = 0
>>> op2 = 1
>>> mul = op1 * op2
>>> op1 = 3
>>> print(mul)
0
Avaliação Preguiçosa
○ Iteradores
■ Objetos que auxiliares que produzem uma sequência
○ Geradores
■ Funções ou expressões que constróem iteradores
Iteradores
>>> next(g)
Terceiro yield
3
Geradores
● Solução funcional
>>> def somaExata(lista, x):
... # retorna verdadeiro se existem dois elementos com soma x
import sys
for line in sys.stdin:
print("linha = %s" % line)
import sys
for line in sys.stdin:
print(f"linha = {line}")
Leitura com eval
entrada = eval(input())
Leitura com eval
import sys
for line in sys.stdin:
caso = eval(line)
# processa o caso de teste
● Versão funcional
import sys
for caso in map(eval, sys.stdin):
# processa o caso de teste
Compreensões de listas
Notação implícita de conjuntos
○ Equivalente a
res = []
res.append(expressão)
Compressão de Listas
○ Equivalente a
res = []
for iterador in lista:
if condição:
res.append(expressão)
Compressão de Listas
def is_prime(n):
if n == 1: return False
return not any(n % k == 0 for k in range(2, n))
def primes(m):
return [n for n in range(1, m) if is_prime(n)]
Paradigma Funcional
Eduardo Feitosa
efeitosa@icomp.ufam.edu.br