programação funcional
TRANSCRIPT
![Page 1: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/1.jpg)
PROGRAMAÇÃOFUNCIONAL
1
@NatanJMai
![Page 2: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/2.jpg)
HISTÓRIA
2
1930 1950 1970 - 1980
Criação do Cálculo Lambda, por
Alonzo Church. Uma maneira de
expressar computações na
forma de funções.
Criação da linguagem LISP,
baseada no Cálculo Lambda, por John
McCarty. Linguagem muito
utilizada até hoje.
David Turner desenvolve
algumas linguagens,
empregando lazy evaluation.
![Page 3: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/3.jpg)
O QUE É?
Programação Funcional
❏ Paradigma diferente que trata todas as computações em forma de funções. Enfatiza o uso de funções e evita o uso de variáveis e estados.
❏ Experiência em outros paradigmas não facilita tanto a programação funcional.
Outros paradigmas:
● Imperativa● Procedural● Lógica● Orientada a objetos.
3
![Page 4: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/4.jpg)
O QUE É?
Programação Funcional
❏ Diferente do paradigma imperativa, aqui não escrevemos “como fazer algo”, mas sim “o que queremos fazer”
Outros paradigmas:
● Imperativa● Procedural● Lógica● Orientada a objetos.
4
- Funcional: Funções, expressões, recursividade.- Imperativa: Atribuições, variáveis, estados.- O. Objetos: Objetos, classes, métodos.
![Page 5: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/5.jpg)
FUNCIONAL vs IMPERATIVA
❏ Funções são as principais formas de transformar dados;
❏ Ao contrário da imperativa, onde valores podem ser alterados, na funcional os valores são imutáveis (immutable state).
❏ Sem loops (while, for, etc) e sim com recursão. Recursividade é a principal forma de iteração entre algo.
5
![Page 6: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/6.jpg)
FUNCIONAL vs IMPERATIVA
6
Funcional Imperativa
FocoQual informação é desejada e quais transformações são necessárias
Sequência de passos e tarefas para obter as informações.
Estados Não existe. É a base da programação.
Ordem Execução
Baixa importância. É a base da programação.
Fluxos.Chamadas de funções, recursividade.
Loops, if’s.
![Page 7: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/7.jpg)
Sequência:- Avaliação preguiçosa- Funções Anônimas- Compreensão de listas - Funções de primeira classe- Funções de alta ordem- Currying- Estados imutáveis.
CARACTERÍSTICAS
7
![Page 8: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/8.jpg)
AVALIAÇÃO PREGUIÇOSA
8
![Page 9: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/9.jpg)
AVALIAÇÃO PREGUIÇOSA
❏ Uma expressão / função não é valorada caso não seja utilizável durante o programa. Assim, os valores que não serão utilizados, não serão computados.
- Ex.: Imagine passar 3 parâmetros para uma função, mas que conforme a sequência precise utilizar apenas 2 deles. Em funções em linguagens como C, Java, os 3 seriam computados.
9
![Page 10: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/10.jpg)
AVALIAÇÃO PREGUIÇOSA
❏ O principal ganho com lazy evaluation além do desempenho, é a habilidade de criarmos estruturas de dados infinitas.
- Como trabalhar facilmente com uma lista infinita?
10
:|
![Page 11: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/11.jpg)
AVALIAÇÃO PREGUIÇOSA
❏ Exemplo de trabalho com uma lista infinita em Haskell:
> [1..]
> [1, 2, 3, 4, ..]
> take 10 [1..]
> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ..]
> take 5 [2, 4..]
> [2, 4, 6, 8, 10]
11
![Page 12: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/12.jpg)
AVALIAÇÃO PREGUIÇOSA
12
LAZINESS IS NOT ALWAYS
BAD.
![Page 13: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/13.jpg)
FUNÇÕES ANÔNIMAS
13
❏ Funções não necessitam de declaração e especificação. Não precisam nem mesmo de um nome, por isso são conhecidas como anônimas. Já não são exclusividade de linguagens funcionais.
Python:> f = lambda x: x * x
> f (3)
> 9
Haskell: \x -> x * x
> (\x -> x * x) 3
> 9
![Page 14: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/14.jpg)
COMPREENSÃO DE LISTAS
14
❏ É uma forma muito simples de trabalhar com listas de dados, tendo em vista que é baseado na notação de definição de conjunto.
Ex.: ➔ S = { x² | x pertença aos números naturais }➔ Haskell:
> [ x ^ 2 | x <- [0..]]
![Page 15: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/15.jpg)
COMPREENSÃO DE LISTAS
15
❏ Alguns exemplos da utilidade da compreensão de listas em Haskell.
Ex.: Soma dos quadrados dos 10 primeiros números > 2.
> sum [ x ^ 2 | x <- take 10 [3..]]> 645
![Page 16: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/16.jpg)
COMPREENSÃO DE LISTAS
16
Ex .: Quadrado dos 10 primeiros ímpares a partir de 3.
> [x ^ 2 | x <- filter odd (take 10 [3..])]
> [ 3², 5², 7², 9², 11²]
> [ 9, 25, 49, 81, 121 ]
![Page 17: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/17.jpg)
FUNÇÕES DE PRIMEIRA CLASSE
17
❏ Possibilidade de armazenar funções em variáveis.
❏ Passagens de funções como parâmetro, para outras funções.
- De forma geral, as funções de primeira classe são tratadas, criadas e utilizadas em qualquer lugar, assim como valores normais.
![Page 18: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/18.jpg)
FUNÇÕES DE PRIMEIRA CLASSE
18
❏ Passagens de funções como parâmetro, para outras funções.
- Ex .: (Haskell)
> map flisol [2, 4, 6, 8]
> [4, 8, 12, 16]
> :t map> map :: (a -> b) -> [a] -> [b]
> flisol :: Float -> Float
> flisol x = (x / 2) * 4
> :t flisol> flisol :: Float -> Float
![Page 19: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/19.jpg)
FUNÇÕES DE ALTA ORDEM
19
❏ Função que recebe funções como parâmetro.
❏ Função que retorna uma outra função.
> map flisol [2, 4, 6, 8]
> [4, 8, 12, 16]
> :t map> map :: (a -> b) -> [a] -> [b]
Função
- Importante na definição do que de fato “é”.
- Podemos passar qualquer função para map.
Parâmetro
Saída
![Page 20: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/20.jpg)
CURRYING
20
❏ Técnica de transformação de uma função com múltiplos parâmetros em uma cadeia de funções com apenas um parâmetro.
> function f(x, y) {
return x + y;
}
> function g(x, y) {
return function (y){
return x + y;
};
}
- f(x, y) == g(x, y)
![Page 21: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/21.jpg)
CURRYING
❏ Em Haskell, todas as funções são de apenas 1 parâmetro, o que ocorre é a utilização da técnica de Currying.
21
> max 4 5
> 5
> (max 4) 5
> 5
> div :: (Floating a) => a -> a
> div = ( / 10)
> (div) 100
> 10
Com Currying, é criado uma função que recebe 4 e retorna uma função que espera um parâmetro, neste caso, o 5.
![Page 22: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/22.jpg)
ESTADOS IMUTÁVEIS
❏ Não é possível alterar o estado de algo, embora possamos criar um novo estado a partir do mesmo.
❏ Excelente vantagem quando trabalhado em softwares que necessitam de concorrência e paralelismo.
22
> fl = 2
> fli = fl + 1
> fli = 3
CORRETO!.
> fl = 2
> fl = flisol + 1
ERRO!.
![Page 23: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/23.jpg)
CURIOSIDADES (Erlang)
- github.com/erlang/otp- www.erlang.org/- Utilizada amplamente no setor de telecomunicações, além de serviços em banco de dados.
23
- Amazon- Yahoo- Facebook (Chat)- WhatsApp- Ericsson.
![Page 24: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/24.jpg)
CURIOSIDADES (Scala)
- github.com/scala/scala- www.scala-lang.org/- Um ponto forte é a criação de linguagens de domínio específico (DSL), como a Rogue.
24
- Linkedin- Twitter- Foursquare- Sony
![Page 25: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/25.jpg)
- www.haskell.org/- www.haskell.org/community- Finanças, web startups, design de hardware, e até fabricantes de cortadores de grama.
CURIOSIDADES (Haskell)
25
- Facebook- Google- Intel- etc.
![Page 26: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/26.jpg)
- Utilizado como linguagem de extensão do software de CAD AutoCAD, desenvolvido pela AutoDesk. - Lisp foi utilizado para desenvolver o primeiro sistema computacional de matemática simbólica, o Macsyma.
CURIOSIDADES (Lisp)
26
- AutoCAD- Emacs- Orbitz- etc.
LISP
![Page 27: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/27.jpg)
EXEMPLOS
❏ Soma dos números ímpares de 0 a 300.
Haskell
27
> sum (filter odd [0..300])
> 22500
Odd - Ímpar (bool)
Sum - Soma a lista
Filter - Filtro
![Page 28: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/28.jpg)
EXEMPLOS
❏ Números entre 0 e 100 divisíveis por 3.
Haskell
28
> filter p [1..100]
> where p x =
> x `mod` 3 == 0
> [3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99]
![Page 29: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/29.jpg)
EXEMPLOS
❏ Soma dos 5 primeiros números maiores que 0 tal que o seu quadrado seja maior que 1000.
Haskell
29
> sum (take 5 [x | x <- [0..], x ^ 2 > 1000])
> 170
![Page 30: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/30.jpg)
EXEMPLOS
❏ Fatorial
Haskell
30
> fat :: (Num a, Eq a) => a -> a
> fat 0 = 1
> fat x = x * fat (x - 1)
> fat 5
> 120
![Page 31: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/31.jpg)
EXEMPLOS
❏ (x, y, z) tal que (x, y, z) <= 50 e 2x + y - z = 1
3x - y + 2z = 7
x + y + z = 6
31
> [(x, y, z) | x <-[0..50], y <- [0..50], z <-[0..50],
(2 * x + y - z) == 1,
(3 * x - y + 2 * z) == 7,
(x + y + z) == 6]
> [(1, 2, 3)]
Haskell
![Page 32: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/32.jpg)
MAIS?
32
❏ Learn You a Haskell(learnyouahaskell.com)
❏ Functional programming in Scala(Coursera, Martin Odersky) - Desenvolvedor da linguagem.
❏ Diversos projetos no Github.
![Page 33: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/33.jpg)
- Natan J. Mai- Estudante de Ciência da Computação, UFFS.- Estudo por conta própria alguns assuntos do meu interesse. Linguagem de programação acabou se tornando um deles.
SOBRE
33
- [email protected] @NatanJMai
@NatanJMai
![Page 34: Programação funcional](https://reader030.vdocuments.site/reader030/viewer/2022020116/55a931511a28ab40368b4582/html5/thumbnails/34.jpg)
34
“Uma linguagem que não afeta a maneira que você pensa sobre
programação, não vale a pena ser aprendida”
Alan Perlis