@marinalimeira_

JavaScript Funcional

Marina Limeira

Agenda

JavaScript

Multi-paradigma

Imperativo

Orientado a Objetos

(com protótipos)

Funcional!

Programação Funcional?

Baseado no
Cálculo Lambda...?

"sistema formal que estuda funções recursivas computáveis

[...]

entidades que podem ser utilizadas como argumentos e retornadas como valores de outras funções"

- Wikipedia
            
fibs :: [Int]
fibs = 0 : 1 : [ a + b | (a, b) <- zip fibs (tail fibs)]
            
          

alguma_coisa.hs

WAT?

Enquanto uma linguagem funcional como Haskell utiliza recursão, uma linguagem imperativa ou multi-paradigma pode utilizar loops.

"Quando se trata de programação funcional, nós queremos reduzir tudo a uma chamada de função."

Funções puras

  • Os dados recebidos não são alterados.

Funções puras

  • Um novo valor é criado e retornado.

Funções matemáticas!

"Uma relação $f: A \to B$ é uma função quando para qualquer x $\in$ A existe um único $(x,y) \in f$."

$f: A \to B, onde f(x) = Pokemon.evolve(x)$

$A$$B$

E o Eevee?

Recebe uma entrada $\to$
transforma $\to$
gera nova uma saída

$f$() =

$f$() =

$f$() =

$f$(, ) =

Sempre é criado um novo objeto

Nada de alterar o estado da entrada :)

Sequência de Fibonnaci

O elemento seguinte é a soma dos dois anteriores

0, 1, 1, 2, 3, 5, 8, 13...

$f: \mathbb Z_{\ge 0} \to \mathbb Z_{\ge 0}, onde f(x) = f(x - 1) + f(x - 2)$

            
const fibonacci = (x) => {
  if (x === 0 || x === 1) {
    return x;
  }
  return fibonacci(x - 1) + fibonacci(x - 2);
}
            
          

$fibonnaci(4) \to$
$fibbonaci(3) + fibbonaci(2)$


$fibonnaci(3) \to$
$fibbonaci(2) + fibbonaci(1)$

...

Cache!

Funções de Alta Ordem

a.k.a. High-Order Functions

$f(g(x))$ === $f \circ g$

Funções de Alta Ordem

  • Recebem uma função (ou mais) como argumento
  • Funções de Alta Ordem

    • Retornam uma função
                
    const evolve = (x) => (Pokemon.evolve(x));
                
              
                
    const tipoAgua = (x) => (x.tipo === 'water');
                
              

    $.map()$ retorna um novo array,

    logo, o Vaporeon não será retornado no $.filter()$ :(

    Funções de Primeira Classe

    a.k.a. First-Class Functions

    Funções de Primeira Classe

  • Funções como valores!
  • Funções de Primeira Classe

  • Logo, podemos guardá-las em variáveis.
  • Ternários

                
    console.log(true ? "verdadeiro" : "falso");
                
              

    Condicionais

                
    console.log(if(true) { "verdadeiro"; } else { "falso"; });
                
              

    SyntaxError: expected expression, got keyword 'if'

    Elixir

    React

    Redux

    github.com/marinalimeira/eeveelution

    Obrigada :)

    marinalimeira.com