Introdução a programação funcional com Elixir v2
-
Upload
arthur-braga-alfredo -
Category
Software
-
view
51 -
download
3
Transcript of Introdução a programação funcional com Elixir v2
Introdução a programação
funcional com Elixir
Arthur Braga Alfredo
1
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
História
3
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
Teoria das funções recursivas - 1931.
Considerado um dos mais importantes
lógicos que já existiu.
Kurt Gödel
5
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
LISP foi criado no MIT em 1960ISWIM em 1966SASL em 1973Miranda e Erlang em 1986Haskell em 1992
Primeiras Linguagens
7
Quais as vantagens daslinguagens funcionais?
8
Imutabilidade
9
Poucos problemas deconcorrência
10
Mais fácil de testar
11
Menos código = Facilidadede manutenção
12
Porque ficou mais nasuniversidades?
13
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
John W. Backus
Turing award em 1977.
“Linguagens de programação convencionais estão ficando
cada vez maiores, mas não mais fortes.”
15
Memória era muito cara
16
Os computadores era lentos
17
Programação paralelaestava engatinhando
18
Multi-processadores também
19
E Nem se falava em multi-core
20
Mas muita coisa mudou
21
Memória
22
Multi-core
23
Multi-processador
24
Mas tem um porém
25
Elixir
27
Brasileiro.
Fez parte do core team do rails.
Participou de muitos projetos open source.
Decidiu criar a linguagem Elixir em 2012.
José Valim
28
Objetivo
Criar uma linguagem que que possibilitasse altaperformance, extensibilidade e produtividade e
que rodasse na VM do Erlang.
29
Porque Erlang?
Criado em 1986 para resolver problemas naárea de telefonia.Altamente tolerante a falhas.Altamente concorrente.Fácil de escalar.
30
Porque Erlang?
https://blog.whatsapp.com/196/1-million-is-so-2011
31
Conceitos
32
O que é programaçãofuncional?
33
É 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
Imutabilidade
Uma vez que uma variável é criada,seu valor não pode mais ser
alterado.
35
Imutabilidade
Eshell V8.0.3
1> A = 10.102> A = 20. ** exception error: no match of right hand side value 20
36
Imutabilidade
Interactive Elixir (1.3.2)
iex(1)> a = 1010iex(2)> a = 2020
37
Imutável?
38
Single matching
A variável não pode mais serreutilizada.
39
Imutabilidade
Interactive Elixir (1.3.2)
iex(4)> a = 1010iex(5)> ^a = 20** (MatchError) no match of right hand side value: 20
40
Rebinding
O valor na memória continuaimutável, mas a variável pode ser
reutilizada.
41
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
Funções anônimas
São funções que podem ser tratadascomo valores e que podem ser
manipuladas ou retornadas por outrasfunções.
43
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
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
Higher-order functions
São funções que recebem ouretornam outras funções.
46
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
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
Pattern Matching
iex> {a, b, c} = {:hello, "world"}** (MatchError) no match of right hand side value: {:hello, "world"}
49
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
Pattern Matching
iex> [head | tail] = [1, 2, 3][1, 2, 3]
iex> head1
iex> tail[2, 3]
51
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
Recursão
São funções que chamam elasmesmas.
53
defmodule Fatorial do def de(1), do: 1 def de(n) when n > 0 do n * de(n-1) endend
Recursão
54
Pipe operator ( |> )
Usa o valor anterior ao pipe como primeiroargumento da próxima função.
55
Operador Pipe (|>)
foo(bar(baz(new_function(other_function()))))
56
Operador Pipe (|>)
other_function() |> new_function() |> baz() |> bar() |> foo()
"Elixir rocks" |> String.upcase |> String.split["ELIXIR", "ROCKS"]
"elixir" |> String.ends_with?("ixir")true
57
Onde aprender mais?
58
Onde aprender mais?
http://elixir-lang.org/
59
#myelixirstatus
60
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
Perguntas?
62
Obrigado
63