introdução a programação funcional com elixir v2
TRANSCRIPT
![Page 1: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/1.jpg)
Introdução a programação
funcional com Elixir
Arthur Braga Alfredo
1
![Page 2: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/2.jpg)
Sobre o que vou falar
História da programação funcional
História do Elixir
Conceitos básicos de programação funcional
Livros e recursos para aprofundar
2
![Page 3: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/3.jpg)
História
3
![Page 4: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/4.jpg)
Teoria da Lógica combinatória - 1927.
Base para o design das linguagens de
programação funcionais.
Higher-order functions.
As linguagens funcionais Haskell, Brooks,
Curry e o conceito currying foram
homenagens a ele.
Haskell Curry
4
![Page 5: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/5.jpg)
Teoria das funções recursivas - 1931.
Considerado um dos mais importantes
lógicos que já existiu.
Kurt Gödel
5
![Page 6: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/6.jpg)
Teoria do cálculo lambda - 1936
Funções anônimas
Influenciou o design do LISP e das linguagens
de programação funcionais em geral.
Conceitos de abstração.
Linguagens de alto nível.
Alonzo Church
6
![Page 7: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/7.jpg)
LISP foi criado no MIT em 1960ISWIM em 1966SASL em 1973Miranda e Erlang em 1986Haskell em 1992
Primeiras Linguagens
7
![Page 8: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/8.jpg)
Quais as vantagens daslinguagens funcionais?
8
![Page 9: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/9.jpg)
Imutabilidade
9
![Page 10: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/10.jpg)
Poucos problemas deconcorrência
10
![Page 11: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/11.jpg)
Mais fácil de testar
11
![Page 12: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/12.jpg)
Menos código = Facilidadede manutenção
12
![Page 13: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/13.jpg)
Porque ficou mais nasuniversidades?
13
![Page 14: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/14.jpg)
Criador da linguagem Fortran - 1950.
Criada dentro da IBM.
Primeira linguagem de alto nível.
Dominou a área de programação.
Continua sendo usada até hoje em super computadores.
.
John W. Backus
14
![Page 15: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/15.jpg)
John W. Backus
Turing award em 1977.
“Linguagens de programação convencionais estão ficando
cada vez maiores, mas não mais fortes.”
15
![Page 16: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/16.jpg)
Memória era muito cara
16
![Page 17: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/17.jpg)
Os computadores era lentos
17
![Page 18: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/18.jpg)
Programação paralelaestava engatinhando
18
![Page 19: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/19.jpg)
Multi-processadores também
19
![Page 20: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/20.jpg)
E Nem se falava em multi-core
20
![Page 21: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/21.jpg)
Mas muita coisa mudou
21
![Page 22: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/22.jpg)
Memória
22
![Page 23: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/23.jpg)
Multi-core
23
![Page 24: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/24.jpg)
Multi-processador
24
![Page 25: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/25.jpg)
Mas tem um porém
25
![Page 27: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/27.jpg)
Elixir
27
![Page 28: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/28.jpg)
Brasileiro.
Fez parte do core team do rails.
Participou de muitos projetos open source.
Decidiu criar a linguagem Elixir em 2012.
José Valim
28
![Page 29: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/29.jpg)
Objetivo
Criar uma linguagem que que possibilitasse altaperformance, extensibilidade e produtividade e
que rodasse na VM do Erlang.
29
![Page 30: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/30.jpg)
Porque Erlang?
Criado em 1986 para resolver problemas naárea de telefonia.Altamente tolerante a falhas.Altamente concorrente.Fácil de escalar.
30
![Page 31: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/31.jpg)
Porque Erlang?
https://blog.whatsapp.com/196/1-million-is-so-2011
31
![Page 32: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/32.jpg)
Conceitos
32
![Page 33: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/33.jpg)
O que é programaçãofuncional?
33
![Page 34: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/34.jpg)
É um paradigma de programação que trata acomputação como uma avaliação de funções
matemáticas e que evita estados ou dadosmutáveis
34
![Page 35: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/35.jpg)
Imutabilidade
Uma vez que uma variável é criada,seu valor não pode mais ser
alterado.
35
![Page 36: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/36.jpg)
Imutabilidade
Eshell V8.0.3
1> A = 10.102> A = 20. ** exception error: no match of right hand side value 20
36
![Page 37: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/37.jpg)
Imutabilidade
Interactive Elixir (1.3.2)
iex(1)> a = 1010iex(2)> a = 2020
37
![Page 38: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/38.jpg)
Imutável?
38
![Page 39: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/39.jpg)
Single matching
A variável não pode mais serreutilizada.
39
![Page 40: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/40.jpg)
Imutabilidade
Interactive Elixir (1.3.2)
iex(4)> a = 1010iex(5)> ^a = 20** (MatchError) no match of right hand side value: 20
40
![Page 41: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/41.jpg)
Rebinding
O valor na memória continuaimutável, mas a variável pode ser
reutilizada.
41
![Page 42: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/42.jpg)
Imutabilidade
iex(12)> soma = 2525
iex(13)> func_soma = fn -> "A soma é #{ soma }" end#Function<20.52032458/0 in :erl_eval.expr/5>
iex(14)> soma = 100100
iex(17)> func_soma.()"A soma é 25"
42
![Page 43: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/43.jpg)
Funções anônimas
São funções que podem ser tratadascomo valores e que podem ser
manipuladas ou retornadas por outrasfunções.
43
![Page 44: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/44.jpg)
Funções anônimas
soma10 = fn (x) -> x + 10 endsoma10.(20) # => 30
multiplica = fn x,y -> x * y endmultiplica.(10,10) # => 100
lista = [1,2,3,4,5]
Enum.map(lista, soma10) [11, 12, 13, 14, 15, 16]
44
![Page 45: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/45.jpg)
Funções puras
Funções sem efeitos colateraisNão acessam bancoNão acessam arquivosVão sempre retornar os mesmo valoresse os mesmos parâmetros forempassados
45
![Page 46: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/46.jpg)
Higher-order functions
São funções que recebem ouretornam outras funções.
46
![Page 47: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/47.jpg)
Higher-order functions
lista = [1,2,3,4,5][1, 2, 3, 4, 5]
Enum.map(lista, fn x -> x * x end)[1, 4, 9, 16, 25]
Enum.reduce(lista, 0, fn(x,y) -> x + y end)15
Enum.reduce(lista, 0, &(&1 + &2))15
Enum.filter(lista, fn x -> x > 2 end)[3, 4, 5]
47
![Page 48: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/48.jpg)
Pattern Matching
iex> {a, b, c} = {:hello, "world", 42}{:hello, "world", 42}
iex> a:hello
iex> b"world"
iex> {a, _, c} = {:hello, "world", 42}{:hello, "world", 42}
iex> a:hello
iex> c42
48
![Page 49: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/49.jpg)
Pattern Matching
iex> {a, b, c} = {:hello, "world"}** (MatchError) no match of right hand side value: {:hello, "world"}
49
![Page 50: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/50.jpg)
Pattern Matching
iex> {:ok, user} = %User{name: "john_cusack", email: "[email protected]"} |> Repo.insert
iex> user%User{id:1, name: "john_cusack", email: "[email protected]"}
iex> {:ok, result} = {:error, :oops}** (MatchError) no match of right hand side value: {:error, :oops}
50
![Page 51: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/51.jpg)
Pattern Matching
iex> [head | tail] = [1, 2, 3][1, 2, 3]
iex> head1
iex> tail[2, 3]
51
![Page 52: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/52.jpg)
Pattern Matching
defmodule Math do def sum_list([head | tail], accumulator) do sum_list(tail, head + accumulator) end
def sum_list([], accumulator) do accumulator endend
IO.puts Math.sum_list([1, 2, 3], 0) #=> 6
52
![Page 53: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/53.jpg)
Recursão
São funções que chamam elasmesmas.
53
![Page 54: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/54.jpg)
defmodule Fatorial do def de(1), do: 1 def de(n) when n > 0 do n * de(n-1) endend
Recursão
54
![Page 55: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/55.jpg)
Pipe operator ( |> )
Usa o valor anterior ao pipe como primeiroargumento da próxima função.
55
![Page 56: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/56.jpg)
Operador Pipe (|>)
foo(bar(baz(new_function(other_function()))))
56
![Page 57: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/57.jpg)
Operador Pipe (|>)
other_function() |> new_function() |> baz() |> bar() |> foo()
"Elixir rocks" |> String.upcase |> String.split["ELIXIR", "ROCKS"]
"elixir" |> String.ends_with?("ixir")true
57
![Page 58: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/58.jpg)
Onde aprender mais?
58
![Page 59: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/59.jpg)
Onde aprender mais?
http://elixir-lang.org/
59
![Page 60: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/60.jpg)
#myelixirstatus
60
![Page 61: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/61.jpg)
Onde aprender mais?
Y Not- Adventures in Functional Programming by Jim Weirich -https://www.youtube.com/watch?v=FITJMJjASUs
Ruby Manor 3 - Programming with Nothing by Tom Stuart -https://www.youtube.com/watch?v=VUhlNx_-wYk
https://medium.com/the-many/learning-elixir-at-made-by-many-557737dafe55#.1hfu0fh8o
61
![Page 62: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/62.jpg)
Perguntas?
62
![Page 63: Introdução a programação funcional com Elixir v2](https://reader035.vdocuments.net/reader035/viewer/2022062503/58a465cb1a28abb8288b601d/html5/thumbnails/63.jpg)
Obrigado
63