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

Post on 13-Apr-2017

51 views 3 download

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

The free lunch is over

26

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: "cusack66@example.com"} |> Repo.insert

iex> user%User{id:1, name: "john_cusack", email: "cusack66@example.com"}

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