JavaScript
Multi-paradigma
Orientado a Objetos
(com protótipos)
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
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.
"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$
Recebe uma entrada $\to$
transforma $\to$
gera nova uma saída
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
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'
React
Redux