@marinalimeira_

Como programar funcional?

Marina Limeira

marinalimeira.com

Rails Girls Maceió

railsgirls.com/maceio

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

Trata a computação como uma avaliação de funções matemáticas e que evita estados ou dados mutáveis

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$

$f$() =

$f$() =

$f$() =

E o Eevee?

$f$(, ) =

Funções puras

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

Funções puras

  • Um novo valor é criado e retornado.

Consumo de memória muito alto!

1957

  • ★ antes de Orientação a Objetos
  • ★ antes de programação estruturada

Elixir

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

Podem retornar uma função

            
const evolve = (x) => (Pokemon.evolve(x));
            
          
            
const tipoAgua = (x) => (x.tipo === 'water');
            
          

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'

Redux

github.com/marinalimeira/eeveelution
						
nomes = ["George", "Carla"]

nomes.map(&lambda { |nome| nome.upcase })
						
					

Ruby

						
nomes = ["George", "Carla"]

map(lambda nome : nome.upper(), nomes)
						
					

Python

            
List<String> nomes = Arrays.asList("George", "Carla");

nomes.map(nome -> nome.toUpperCase());
          	
          

Java 8

Obrigada :)

marinalimeira.com