Este documento apresenta uma introdução à programação funcional. Resume as seguintes informações essenciais:
1) Apresenta o palestrante Natan J. Mai e fornece um breve resumo sobre o nível e linguagem abordados.
2) Explica os principais conceitos da programação funcional como paradigma baseado em funções, avaliação preguiçosa, funções de alta ordem e estados imutáveis.
3) Lista alguns exemplos de empresas que utilizam linguagens funcionais como Haskell, Erlang e Scala.
4. Conteúdo
◦ O que é e de onde vem.
◦ Diferenças entre paradigmas.
◦ Algumas características.
◦ Exemplos
◦ Quem usa.
INFO
Você devia ensinar o que sabe (mesmo não sendo um especialista) - papodehomem.com.br
6. O QUE É?
Paradigma Funcional
◦ Forma diferente de computação
◦ Baseado no cálculo por funções.
◦ Dizemos o que deve ser feito e
não mais como ser feito.
◦ Baseado no Cálculo Lâmbda,
apresentado por Alonzo Church
na década de 1930.
7. O QUE É?
Paradigma Funcional
◦ Pense em um problema simples,
descobrir (x, y) tal que x + y = 6,
assumindo x e y menores que
10.
Obs: (x, y) entre 0 e 10.
8. O QUE É?
Paradigma Funcional
# Atividade 01
$ Criar arquivo atividade01.hs
-- code.
$ ghci
$ :load atividade01.hs
$ fx
9. O QUE É?
Paradigma Funcional
◦ Este é um problema onde
sabemos o que deve ser feito.
◦ No paradigma imperativo
teríamos que construir uma
forma de resolver.
13. PARADIGMAS
◦ Resumidamente:
- Funcional
- Funções, cálculo-λ e recursão.
- Imperativo
- If, while, for e por aí vai.
- Lógico
- Implicações.
- Orientado a Objetos
- Classes, objetos e métodos.
14. PARADIGMAS
◦ Funcional vs Imperativo
Foco Qual informação é
necessária e quais
transformações são
necessárias.
Sequência de
passos bem (?)
definida.
Ordem de
execução
Baixa importância. É o mais
importante.
Fluxos Funções e
recursividade.
While, if, for.
15. PARADIGMAS
◦ Exemplos de linguagens:
- Funcional
- Haskell, OCaml, Erlang etc.
- Imperativo
- C, Java, PHP, etc.
- Lógico
- Prolog.
16. CARACTERÍSTICAS
◦ Algumas das principais
características:
- Avaliação preguiçosa.
- Funções anônimas.
- Funções de alta ordem.
- Compreensão de listas.
- Currying
- Estados imutáveis.
19. LAZY EVALUATION
◦ As expressões não são avaliadas
caso não sejam utilizadas.
Valores não avaliados não serão
utilizados.
◦ O paradigma imperativo utiliza
eager evaluation.
20. LAZY EVALUATION
Exemplo de lazy evaluation:
# Atividade 02
Obter os três primeiros números
da lista começando no número 1.
$ Abrir arquivo atividade01.hs
Comando take.
21. LAZY EVALUATION
Exemplo de lazy evaluation:
# Atividade 03
Obter a primeira tupla do
exercício (01), do x + y = 6.
$ Abrir arquivo atividade01.hs
Ajustar função anterior.
22. FUNÇÕES ANÔNIMAS
Funções anônimas são logicamente
funções sem nome, mas também sem
qualquer tipo de definição anterior.
$ (x -> x) “Quem sou eu?”
23. FUNÇÕES ANÔNIMAS
◦ Também conhecidas como
funções Lambda.
- Não é necessário definição.
- Interessante quando é preciso
funções casuais.
- Bastante util quando utilizadas
como parâmetro.
25. FUNÇÕES DE ALTA
ORDEM
Funções que recebem outras funções
como parâmetro, além de poder
retornar uma função como resultado.
$ map (x -> x ^ 2) [1, 2, 3]
26. FUNÇÕES DE ALTA ORDEM
◦ Muitas vezes precisamos passar
funções como parâmetro.
- Bastante util quando utilizamos
funções anônimas.
$ :t map
map :: (a -> b) -> [a] -> [b]
Parâmetros da função map
(a -> b) - é uma função como parâmetro
[a] - é uma lista como parâmetro
[b] é o resultado da função map
27. FUNÇÕES DE ALTA ORDEM
◦ Map é uma função que recebe
uma função e uma lista como
parâmetro e aplica a função
para todos os itens da lista.
# Atividade 04
Criar a nossa própria função
map.
29. COMPREENSÃO DE LISTAS
◦ Qual a diferença entre
{(x, 2x) | x ∈ ℕ, x <= 5} e
[(x, 2 * x) | x <- [0..9], x <= 5] ?
- Resposta: Nenhuma!
[(x, 2 * x) | x <- [0..9], x <= 5]
Resultado Conj. Entrada Predicado
30. COMPREENSÃO DE LISTAS
◦ Existem várias funções
interessantes para se trabalhar
com listas, algumas delas são:
- head [1,2, 3] reverse [1,2,3]
- tail [1,2, 3] take 1 [1,2,3]
- maximum [1,2,3] last [1,2,3]
- minimum [1,2,3] length [1,2,3]
- product [1,2,3] sum [1,2,3]
...
31. COMPREENSÃO DE LISTAS
◦ Se vermos listas como uma
centopéia, poderíamos
representá-lo assim:
HeadLast
Tail
32. COMPREENSÃO DE LISTAS
# Atividade 05.0
- Receber os 14 primeiros valores a
partir de -1 e atribuir em uma
‘variável’ a.
- (Dica > take)
Resultado ->
33. COMPREENSÃO DE LISTAS
# Atividade 05.1
- Para todo valor na lista a,
multiplicar pelo seu quadrado e
armazenar em b. Feito isso,
reverter a lista b.
- (Dica > [... | ...])
Resultado ->
34. COMPREENSÃO DE LISTAS
# Atividade 05.2
- Somar todos esses valores de b.
- Dica > “Soma” em Inglês :)
Resultado ->
35. COMPREENSÃO DE LISTAS
# Atividade 06
- Soma dos quadrados dos 10
primeiros números > 2.
Dicas
> “Soma” em Inglês :)
> “take 10”
> “[ .. | .. ]”
Resultado ->
36. COMPREENSÃO DE LISTAS
# Atividade 07
- (x, y, z) tal que (x, y, z) <= 50 e
2x + y - z = 1
3x - y + 2z = 7
x + y + z = 6
Dicas
> [ (x, y, z) | x <- [0..50], y <- [0..50], z <- [0..50] .. ]
Resultado ->
37. COMPREENSÃO DE LISTAS
# Atividade 08
Soma dos 5 primeiros números
maiores que 0 tal que o seu
quadrado seja maior que 1000.
Dicas
> sum (take 5 [ x | x <- [0..], … ]
Resultado ->
38. CURRYING
Currying é uma técnica capaz de
transformar uma função de múltiplos
parâmetros em várias funções de
apenas um parâmetro.
39. CURRYING
◦ No fundo, todas as funções em
Haskell recebem apenas um
parâmetro. Em funções que
parecem ser com vários, o que
acontece é a técnica de
Currying.
40. CURRYING
Exemplos:
# Atividade 06
- $ div 10 5 é o mesmo que
- $ (div 10) 5
Podemos dizer que (div 10)
recebe o primeiro argumento (10)
e retorna uma função aguardando
o segundo argumento (5).
41. CURRYING
Exemplos:
# Atividade 06
$ div 10 5 é o mesmo que
$ (div 10) 5
:t div
$ div :: Integral a => a -> a -> a
$ div :: Integral a => a -> (a -> a)
São equivalentes.
44. ESTADOS IMUTÁVEIS
◦ Pode parecer estranho, mas
restringindo a possibilidade de
mudanças de estados trazem
vários benefícios, tais como:
- Valores constantes em
programas paralelos e
concorrentes.
45. ESTADOS IMUTÁVEIS
- Para a mudança de estados
ocorrer, é necessário da criação
de um novo estado.
Exemplo:
$ p = sum [2, 3, 4, 5]
$ q = p - 1
Agora sim.
46. QUEM USA?
Algumas das principais empresas e
produtos que utilizam programação
funcional.
?
47. QUEM USA.
◦ Haskell
- Facebook,
- Twitter,
- Intel,
- Microsoft,
- NVIDIA
https://wiki.haskell.org/Haskell_in_industry
48. QUEM USA.
◦ Scala
- LinkedIn,
- Twitter,
- Xerox,
- Foursquare,
- Sony
http://www.scala-lang.org/old/node/1658
49. QUEM USA.
◦ Erlang
- Facebook,
- Whatsapp,
http://www.erlang.org/faq/introduction.html
50. “
Uma linguagem que não afeta a
maneira que você pensa sobre
programação, não vale a pena ser
aprendida.
Alan Perlis
51. NATAN
- Todos os códigos estão em
github.com/NatanJMai
- Slides em
slideshare.net/natanmai9
- Dúvidas/Sugestões
natan.mai@hotmail.com
53. CREDITS
Special thanks to all the people who made
and released these awesome resources for
free:
◦ Presentation template by SlidesCarnival
◦ Photographs by Unsplash
◦ Imagens do site learnyouahaskell.
54. This presentations uses the following typographies and
colors:
◦ Titles & body copy: Quicksand
You can download the fonts on this page:
http://www.google.com/fonts#UsePlace:use/Collection:Quicksand:300,400,700
Click on the “arrow button” that appears on the top right
◦ Dark gray #2e3037
◦ Aqua #39c0ba
◦ Salmon #f35b69
◦ Blue #6d9eeb
You don’t need to keep this slide in your presentation. It’s only here to serve you as a design guide
if you need to create new slides or download the fonts to edit the presentation in PowerPoint®
PRESENTATION DESIGN
55. SlidesCarnival icons are
editable shapes.
This means that you can:
● Resize them
without losing
quality.
● Change line color,
width and style.
Isn’t that nice? :)
Examples: