Slide 1

Slide 1 text

ANA LUIZA BASTOS github.com/anabastos @naluhh @anapbastos Software Developer na Quanto e cientista da computação na PUC-SP anabastos.me

Slide 2

Slide 2 text

JAVASCRIPT FUNCIONAL COM RAMDA

Slide 3

Slide 3 text

JS pode ser usado como uma linguagem funcional?

Slide 4

Slide 4 text

Javascript tem funções de primeira ordem (HOF)

Slide 5

Slide 5 text

Quando falamos de funcional nessas linguagens falamos de “Mantenabilidade” “Menos bugs” “Declaratividade”

Slide 6

Slide 6 text

JS vem aos poucos adotando elementos de linguagens funcionais

Slide 7

Slide 7 text

PROPOSALS

Slide 8

Slide 8 text

Flatmap Partial Application Pipeline operator Pattern Matching

Slide 9

Slide 9 text

RAMDA

Slide 10

Slide 10 text

Biblioteca que foi pensada para tornar mais fácil o javascript funcional

Slide 11

Slide 11 text

● 100% imutável ● ganho em performance ● legibilidade ● point-free / tacit programming

Slide 12

Slide 12 text

● Lists(map, filter, reduce, contains, replace, passAll, crop, flatten, find) ● Maths(inc, add, mean, sum) ● String(split, replace) ● Logics(equals, cond, not) ● Relation(intersection, clamp, gt, lt) ● Functions(curry, pipe, compose, ifElse, etc)

Slide 13

Slide 13 text

TODAS AS FUNÇÕES SÃO CURRIED

Slide 14

Slide 14 text

const add = (x, y) => x + y add(1, 2); // 3 add(1) // Error

Slide 15

Slide 15 text

const add = x => y => x + y add(1, 2); // 3 add(1) // Function

Slide 16

Slide 16 text

R.add(1, 2); // 3 R.add(1) // Function

Slide 17

Slide 17 text

CURRY (PROPOSAL PARTIAL APPLICATION)

Slide 18

Slide 18 text

const curryAdd = R.curry((x, y) => x + y)) curryAdd(1, 2); // 3 curryAdd(1)(2); // 3

Slide 19

Slide 19 text

PIPE / COMPOSE (PROPOSAL PIPELINE OPERATOR)

Slide 20

Slide 20 text

PIPE / COMPOSE: compõe funções de forma sequencial function1 function2 INPUT OUTPUT

Slide 21

Slide 21 text

EXEMPLINHO

Slide 22

Slide 22 text

Happy Hour: ● Soma o consumido ● Adiciona os 10% ● Divide entre os colegas

Slide 23

Slide 23 text

const conta = [9, 9, 9, 9, 15]

Slide 24

Slide 24 text

const divideConta = R.pipe( R.sum, // 51 R.mul(1.1), // 56,1 R.divide(6) // 9,35 ) divideConta(conta)

Slide 25

Slide 25 text

PIPE COMPOSE

Slide 26

Slide 26 text

const ListOfItems = R.compose( Box, List, ListItems )([{...}, {...}, {...}])

Slide 27

Slide 27 text

PIPEP / COMPOSEP

Slide 28

Slide 28 text

then().then().then().then()

Slide 29

Slide 29 text

const asyncStuff = R.pipeP( getId, getUserById, asyncStuff ) // Promise

Slide 30

Slide 30 text

IFELSE (maybe monad)

Slide 31

Slide 31 text

const findName = R.ifElse( R.has('name'), R.prop('name'), R.always('no name'), )({ id: 123, name: “ana”}) // “ana”

Slide 32

Slide 32 text

FLATTER (PROPOSAL FLATMAP)

Slide 33

Slide 33 text

R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, 12]]]]); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

Slide 34

Slide 34 text

DATA HANDLING

Slide 35

Slide 35 text

EVOLVE

Slide 36

Slide 36 text

{ name: “Ana” email: “HELLO@ANABASTOS.ME”, phone: “11 98698-3010”, address: “rua da aparecida 304 apt34 ”, }

Slide 37

Slide 37 text

R.evolve({ email: R.toLower, phone: R.replace(‘-’, ‘’), })(data) // { // name: “Ana” // email: “hello@anabastos.me”, // phone: “11 9869983010” // address: ... // }

Slide 38

Slide 38 text

APPLY SPEC

Slide 39

Slide 39 text

const createObj = R.applySpec({ counter: R.inc, userData: { phone: R.trim}, }) createObj(0, “ 98499-1900”) // {1, userData{ phone: “9849919000”}}

Slide 40

Slide 40 text

TryCatch Cond Memoization Lenses

Slide 41

Slide 41 text

BOM TOOLBOX

Slide 42

Slide 42 text

COOKBOOK

Slide 43

Slide 43 text

● Rambda - github.com/selfrefactor/rambda ● Ramda-fantasy - github.com/ramda/ramda-fantasy ● Thinking Ramda - randycoulman.com/blog/2016/05/24/thinking-in-ramda-getting -started ● Ramda - Derek Stavis(Pagar.me talks)

Slide 44

Slide 44 text

OBRIGADA :) speakerdeck.com/anabastos anabastos.me github.com/anabastos @naluhh @anapbastos