Introdução a programação funcional com Elixir v2

63
Introdução a programação funcional com Elixir Arthur Braga Alfredo 1

Transcript of Introdução a programação funcional com Elixir v2

Page 1: Introdução a programação funcional com Elixir v2

Introdução a programação

funcional com Elixir

Arthur Braga Alfredo

1

Page 2: Introdução a programação funcional com Elixir v2

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

História

3

Page 4: Introdução a programação funcional com Elixir v2

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

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

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

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

Quais as vantagens daslinguagens funcionais?

8

Page 9: Introdução a programação funcional com Elixir v2

Imutabilidade

9

Page 10: Introdução a programação funcional com Elixir v2

Poucos problemas deconcorrência

10

Page 11: Introdução a programação funcional com Elixir v2

Mais fácil de testar

11

Page 12: Introdução a programação funcional com Elixir v2

Menos código = Facilidadede manutenção

12

Page 13: Introdução a programação funcional com Elixir v2

Porque ficou mais nasuniversidades?

13

Page 14: Introdução a programação funcional com Elixir v2

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

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

Memória era muito cara

16

Page 17: Introdução a programação funcional com Elixir v2

Os computadores era lentos

17

Page 18: Introdução a programação funcional com Elixir v2

Programação paralelaestava engatinhando

18

Page 19: Introdução a programação funcional com Elixir v2

Multi-processadores também

19

Page 20: Introdução a programação funcional com Elixir v2

E Nem se falava em multi-core

20

Page 21: Introdução a programação funcional com Elixir v2

Mas muita coisa mudou

21

Page 22: Introdução a programação funcional com Elixir v2

Memória

22

Page 23: Introdução a programação funcional com Elixir v2

Multi-core

23

Page 24: Introdução a programação funcional com Elixir v2

Multi-processador

24

Page 25: Introdução a programação funcional com Elixir v2

Mas tem um porém

25

Page 26: Introdução a programação funcional com Elixir v2

The free lunch is over

26

Page 27: Introdução a programação funcional com Elixir v2

Elixir

27

Page 28: Introdução a programação funcional com Elixir v2

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

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

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

Porque Erlang?

https://blog.whatsapp.com/196/1-million-is-so-2011

31

Page 32: Introdução a programação funcional com Elixir v2

Conceitos

32

Page 33: Introdução a programação funcional com Elixir v2

O que é programaçãofuncional?

33

Page 34: Introdução a programação funcional com Elixir v2

É 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

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

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

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

Imutável?

38

Page 39: Introdução a programação funcional com Elixir v2

Single matching

A variável não pode mais serreutilizada.

39

Page 40: Introdução a programação funcional com Elixir v2

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

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

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

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

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

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

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

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

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

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

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

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

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

Recursão

São funções que chamam elasmesmas.

53

Page 54: Introdução a programação funcional com Elixir v2

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

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

Operador Pipe (|>)

foo(bar(baz(new_function(other_function()))))

56

Page 57: Introdução a programação funcional com Elixir v2

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

Onde aprender mais?

58

Page 59: Introdução a programação funcional com Elixir v2

Onde aprender mais?

http://elixir-lang.org/

59

Page 60: Introdução a programação funcional com Elixir v2

#myelixirstatus

60

Page 61: Introdução a programação funcional com Elixir v2

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

Perguntas?

62

Page 63: Introdução a programação funcional com Elixir v2

Obrigado

63