Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Arthur
September 27, 2016

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

Palestra apresentada na BH-TEC em Belo Horizonte em 27/09/2016. Falei um pouco sobre a história da programação funcional, história do Elixir e alguns conceitos básicos de programação funcional.

Arthur

September 27, 2016
Tweet

More Decks by Arthur

Other Decks in Programming

Transcript

  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
  2. 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
  3. Teoria das funções recursivas - 1931. Considerado um dos mais

    importantes lógicos que já existiu. Kurt Gödel 5
  4. 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
  5. LISP foi criado no MIT em 1960 ISWIM em 1966

    SASL em 1973 Miranda e Erlang em 1986 Haskell em 1992 Primeiras Linguagens 7
  6. 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
  7. John W. Backus Turing award em 1977. “Linguagens de programação

    convencionais estão ficando cada vez maiores, mas não mais fortes.” 15
  8. Brasileiro. Fez parte do core team do rails. Participou de

    muitos projetos open source. Decidiu criar a linguagem Elixir em 2012. José Valim 28
  9. Porque Erlang? Criado em 1986 para resolver problemas na área

    de telefonia. Altamente tolerante a falhas. Altamente concorrente. Fácil de escalar. 30
  10. É um paradigma de programação que trata a computação como

    uma avaliação de funções matemáticas e que evita estados ou dados mutáveis 34
  11. Imutabilidade Eshell V8.0.3 1> A = 10. 10 2> A

    = 20. ** exception error: no match of right hand side value 20 36
  12. Imutabilidade Interactive Elixir (1.3.2) iex(4)> a = 10 10 iex(5)>

    ^a = 20 ** (MatchError) no match of right hand side value: 20 40
  13. Imutabilidade iex(12)> soma = 25 25 iex(13)> func_soma = fn

    -> "A soma é #{ soma }" end #Function<20.52032458/0 in :erl_eval.expr/5> iex(14)> soma = 100 100 iex(17)> func_soma.() "A soma é 25" 42
  14. Funções anônimas São funções que podem ser tratadas como valores

    e que podem ser manipuladas ou retornadas por outras funções. 43
  15. Funções anônimas soma10 = fn (x) -> x + 10

    end soma10.(20) # => 30 multiplica = fn x,y -> x * y end multiplica.(10,10) # => 100 lista = [1,2,3,4,5] Enum.map(lista, soma10) [11, 12, 13, 14, 15, 16] 44
  16. Funções puras Funções sem efeitos colaterais Não acessam banco Não

    acessam arquivos Vão sempre retornar os mesmo valores se os mesmos parâmetros forem passados 45
  17. 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
  18. 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> c 42 48
  19. Pattern Matching iex> {a, b, c} = {:hello, "world"} **

    (MatchError) no match of right hand side value: {:hello, "world"} 49
  20. 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
  21. Pattern Matching iex> [head | tail] = [1, 2, 3]

    [1, 2, 3] iex> head 1 iex> tail [2, 3] 51
  22. Pattern Matching defmodule Math do def sum_list([head | tail], accumulator)

    do sum_list(tail, head + accumulator) end def sum_list([], accumulator) do accumulator end end IO.puts Math.sum_list([1, 2, 3], 0) #=> 6 52
  23. defmodule Fatorial do def de(1), do: 1 def de(n) when

    n > 0 do n * de(n-1) end end Recursão 54
  24. Pipe operator ( |> ) Usa o valor anterior ao

    pipe como primeiro argumento da próxima função. 55
  25. Operador Pipe (|>) other_function() |> new_function() |> baz() |> bar()

    |> foo() "Elixir rocks" |> String.upcase |> String.split ["ELIXIR", "ROCKS"] "elixir" |> String.ends_with?("ixir") true 57
  26. 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