Slides disponíveis em:

☞ http://bit.ly/funcional-nug

Essa talk

é sobre experiências!

#1

The Doors

É

MUITO F$%&

#2

 FUNCIONAL TAMBÉM!

O MATHEUS...

  • Unix Philosopher (de Windows)

  • Alquimista da Web

  • Curtidor de indie e rock

  • APAIXONADO por comunidades e open source

/mabrasil

@mabrasil_io

O QUE VAI ROLAR HOJE...

  • JAVASCRIPT É TIPO JAVA NÉ?

  • PRÉ-PROCESSADORES JS (NÃO XINGO O COFFEE, JURO!)

  • FUNCIONAL É QUANDO FUNCIONA?

  • O TAL LIVESCRIPT (<3)

  • VAMO COMEÇAR?

VAMO LEVANTAR A MÃO?

  • JavaSCRIPT?

  • PRÉ-PROCESSADORES JS?

  • FUNCIONAL?

  • LIVESCRIPT?

QUEM AQUI?

ESSA TALK É PRA VOCÊS!

JAVASCRIPT

- Brendan Eich

  • Browser

  • SERVER

  • MOBILE

  • IoT

  • ...

O QUE TEM DE 10/10:

Self

OO

SCHEME

FUNCIONAL

FUNCIONAL

✔ Pensar em quais informações eu quero e que transformações são necessárias para alcançá-las

✘ Como executar tarefas (algoritmos)

✔ Evitar ao máximo mudanças de estado

✘ Promover e acompanhar mudanças de estado

✔ Pensar em fluxo baseado em chamadas de funções

✘ Loops, condicionais, métodos...

✔ Ter funções como unidade primária

✘ Instâncias de classes, estruturas...

Pure Functions

--| Exemplos

quadrado :: Integer -> Integer
quadrado x = x * x

somaTres :: Integer -> Integer -> Integer -> Integer
somaTres x y z = x + y + z

fatorial :: Integer -> Integer
fatorial n = product [1..n]

High-Order Functions

--| Exemplos

map :: (a -> b) -> [a] -> [b]
filter :: (a -> Bool) -> [a] -> [a]

First Class Functions

var add = function(a, b){
  return a + b
}

Pattern Matching

checaIntervalo :: (Integral a) => a -> String
checaIntervalo 1 = "Um"
checaIntervalo 2 = "Dois"
checaIntervalo 3 = "Três"
checaIntervalo 4 = "Quatro"
checaIntervalo 5 = "Cinco"
checaIntervalo _ = "Não tá no intervalo"

--| Se lembram do fatorial?

fatorial :: (Integral a) => a -> a
fatorial 0 = 1
fatorial n = n * fatorial (n - 1)

List Comprehensions

 

quadrado = [ x * x | x <- nums, x > 2 ]

-- | Se lembram do map?
[x+3 | x <- [1,5,3,1,6]]

-- | Com um predicado...
[ 2*x | x <- [0..], x ^ 2 > 3 

...

EM RESUMO...

  • O que deve ser feito e não como deve ser feito

  • Minimizar mudanças de estado e efeitos colaterais

  • FUNÇÕES COMO UNIDADE ESSENCIAL (Composição, Currying, Aplicação Parcial, Recursão)

JS + FUNCIONAL

Array. forEach()

function forLoop(arr){
  for(var i=0, length = arr.length; i<length; i++){
     console.log(arr[i] + " °C")
  }
}
function forEachLoop(arr){
  arr.forEach(function(temp){
     console.log(temp + " °C")
  )}
}

Array. MAP()

function converToFar(arr){
   var convertedArr = [];
   for(var i = 0, length = arr.length; i<length; i++){
     var convertedTemp = arr[i] * 9/5 + 32;
     convertedArr.push(convertedTemp)
   }
   return convertedArr;
}
function mapToFar(arr){
  return arr.map(function(temp){
    return temp * 9/5 +32;  
  }
}

Array. FILTER()

function freezingTemps(arr){
   var subZero = []
   for(var i = 0, length = arr.length; i<length; i++){
      if(arr[i]<0){
        subZero.push(arr[i])
      }
   }
 }

function filterFreezing(arr){
   return arr.filter(function(temp){
      return temp < 0
  })
}

Array. REDUCE()

function sumOfTemps(arr){
  var sum = 0;
  for(var i = 0, length = arr.length; i<length; i++){
    sum += arr[i];
  }
  return sum;
}



function reduceSum(arr){
  return arr.reduce(function(prev, next){
    return prev + next;
  },0)
}

PRÉ-PROCESSADORES JAVASCRIPT

Languages built on top of JavaScript, to enhance its good parts and rid its bad parts.

- Jú Gonçalves

...

O LIVESCRIPT

Concatenation

[1, 2] +++ [3, 4]
[1, 2] +++ 3

#=> V.S.

[1, 2].concat([3, 4]);
[1, 2].concat(3);

Array of words

<[one two three]>

#=> V.S.

['one', 'two', 'three']

PIPE OPERATOR

[1 2 3] |> map (* 2) |> sum 

#=> V.S.

sum(
map((function(it){
  return it * 2;
}))(
[1, 2, 3]));

list comprehensions

[x ** y for x in [10, 20] for y in [2, 3]]

#=>

[100, 1000, 400, 8000]

HIGH-ORDER FUNCTIONS/PRELUDE

each (.push \NUG), [['a'] ['b'] ['c']]
#=> [['a', 'NUG'], ['b', 'NUG'], ['c', 'NUG']]

map (* 2), [1 to 5]
#=> [2, 4, 6, 8, 10]

filter (< 3), [1 to 5]
#=> [1, 2]

fold (+), 0, [1 to 5] 
#=> 15

EM RESUMO...

  • Melhor controle de fluxo

  • UMA LIB PADRÃO FUNCIONAL

  • CURVA DE APRENDIZADO NÃO MUITO GRANDE

  • ERROS EM TEMPO DE COMPILAÇÃO

  • EXPRESSIVIDADE

  • TESTABILIDADE

  • ESCALABILIDADE

VAMO COMEÇAR?

npm install -g livescript

PERGUNTAS?

Break On Through (To The λ Side)

By Matheus Brasil

Break On Through (To The λ Side)

Veremos como conceitos antigos de programação funcional podem fazer a diferença nos dias atuais para desenvolvedores JS por meio do LiveScript: um pré-processador que, através de melhorias de sintaxe e outros recursos, acaba tornando-se uma ótima alternativa para se iniciar no mundo funcional. Depois deste NUG-CE - com first-class functions, high-order functions, currying, composição, pipes e outras coisas mais -, você nunca mais escreverá o mesmo código.

  • 940