Sua Jornada para se tornar um mestre f(P)

Hi!

  • Computer Engineer
  • Programming
  • Electronics
  • Math <3 <3
  • Physics
  • Lego
  • Meetups
  • Animals
  • Coffee
  • GIFs

DISCLAIMER

Conteúdo introdutório

Pouco tempo

Pokémon, GIFs e analogias

Por que muita gente tem falado sobre

Programação Funcional?

Deixa eu ver qual é:

WAT

Apenas:

  • Lambda calculus
  • Lisp
  • Haskell
  • Scala
  • Clojure
  • Papers
  • Academia
  • Category Theory
  • λ
  • λ
  • λ

Pokémon

Precisamos dar ordens para os Pokémons

Programação

Damos instruções apra alguns códigos

i = i+1;

Pokémon

Precisamos saber como algumas coisas funcionam

Programação

Precisamos saber como manejar algumas informações no código

  • Tipos de Dados
  • Evolução
  • Como agrupar?
  • Quais atributos importantes?
  • Regras de negócio
  • Tipos de Pokémon
  • Evolução
  • Estratégia de time
  • EV/IV
  • Ataques
  • Itens
  • Trocas

level >=16

f(evol)

level igual o da entrada

Como poderia conseguir um Charizard a partir de um Charmander?

level >=16

f(evol)

level igual o da entrada

level igual o da entrada

f(up)

level = 36

level=36

f(evol)

level = 36

Ou ainda:

level >=36

f(evol)

level igual o da entrada

f(evol)

level igual o da entrada

High Order Function

f(x) => g(x) => h(x)

Em algumas competições, existe uma soma máxima para os níveis do time

Time

  • Charizard, lvl 100
  • Lapras, lvl 100
  • Dragonite, lvl 100
  • Rhydon, lvl 100
  • Pidgeotto, lvl 100
  • Gengar, lvl 100

Soma dos níveis: 600

  • Gengar, lvl 100
  • Charizard, lvl 100
  • Lapras, lvl 100
  • Rhydon, lvl 100
  • Pidgeotto, lvl 100
  • Dragonite, lvl 100

Soma dos níveis: 600

  • Lapras, lvl 100
  • Gengar, lvl 100
  • Charizard, lvl 100
  • Rhydon, lvl 100
  • Pidgeotto, lvl 100
  • Dragonite, lvl 100
  • Pidgeotto, lvl 100
  • Lapras, lvl 100
  • Gengar, lvl 100
  • Dragonite, lvl 100
  • Charizard, lvl 100
  • Rhydon, lvl 100
Credits: @bitemyapp and @argumatronic - http://haskellbook.com/

somaTudoQueEstaNaArrayEDeOResultado([100,100, 100,100,100,100])

fold|reduce|outos_nomes

(reduce + [100 100 100 100 100 100])  ;;=> 600

O que posso ter no time além de Pokémons?

Eggs

Time

  • Charizard, lvl 100
  • Lapras, lvl 100
  • Dragonite, lvl 100
  • Egg
  • Pidgeotto, lvl 100
  • Gengar, lvl 100

Soma dos níveis: 500

O egg não interfere na soma

Egg level = 0

Não altera valor

Egg é análogo ao identity element p/ level. 

  • Gengar, lvl 100
  • Charizard, lvl 100
  • Lapras, lvl 100
  • Egg
  • Pidgeotto, lvl 100
  • Dragonite, lvl 100

Soma dos níveis: 500

  • Lapras, lvl 100
  • Gengar, lvl 100
  • Charizard, lvl 100
  • Egg
  • Pidgeotto, lvl 100
  • Dragonite, lvl 100
  • Pidgeotto, lvl 100
  • Lapras, lvl 100
  • Gengar, lvl 100
  • Dragonite, lvl 100
  • Charizard, lvl 100
  • Egg

reduce

(reduce + 0[100 100 100 100 100])  ;;=> 500

identity element

collection

MONOIDS

Itens do Jogo

Itens do Jogo

[

]

Collection

Itens do Jogo

[

]

Collection

(map upgrade                        )  


;;=>

[

]

Itens do Jogo

[0]

[1]

Optional

Itens do Jogo

Optional

(map change              )  


;;=>
[
]
[
]

Itens do Jogo

[

]

Em algum momento você terá as insígnias

Future

Itens do Jogo

[

]

(map other_cont              )  


;;=>

[

]

Future

[ Pokébolas]

[ Bike ]

[ Insígnias ]

=>

=>

=>

[ Pokébolas]

[ Bike ]

[ Insígnias ]

[ Pokébolas]

[ Bike ]

[ Insígnias ]

=>

=>

=>

[ Pokébolas]

[ Bike ]

[ Insígnias ]

FUNCTORS

Move set

e moves

{Surf: 15},

{Fissure: 5},

{Solarbeam: 10},

{Eruption: 5}

Moves

[

]

{Surf: 15},

{Fissure: 5},

{Solarbeam: 10},

{Eruption: 5}

Moves

decrease_pp_used_move[{Surf: 15}]

[

]

[{Surf: 14}],

{Fissure: 5},

{Solarbeam: 10},

{Eruption: 5}

[

]

[]

[            ]

[                     ]

{Surf: 15},

{Fissure: 5},

{Solarbeam: 10},

{Eruption: 5}

Moves

[

]

{Surf: 14},

{Fissure: 5},

{Solarbeam: 10},

{Eruption: 5}

(flatten decrease_pp [{Surf:15}])  


;;=> [{Surf: 14}, {Fissure: 5}, {Solarbeam: 10}, {Eruption: 5}]

Collection

Item

[Scope Lens]

boost_move

{Fissure:5},

{Surf:15},

{Solarbeam: 10},

{Eruption: 5}

[

]

{Fissure:5},

[{Surf:15:boosted}],

{Solarbeam: 10},

{Eruption: 5}

[

]

Optional

Item

[Scope Lens]

{Fissure:5},

{Surf:15},

{Solarbeam: 10},

{Eruption: 5}

[

]

Optional

(flatten boost_move [{Surf:15}]
;;=> [{Fissure:5}, {Surf: 15:boosted}, {Solarbeam: 10}, {Eruption: 5}]

{Fissure:5},

{Surf:15},

{Solarbeam: 10},

{Eruption: 5}

[

]

Future

{Fissure:5},

{Surf:15},

{Solarbeam: 10},

{Eruption: 5}

[

]

Moves

forget

{Fissure:5},

[],

{Solarbeam: 10},

{Eruption: 5}

[

]

{Fissure:5},

{Surf:15},

{Solarbeam: 10},

{Eruption: 5}

[

]

Future

(flatten forget [{Surf:15}]
;;=> [{Fissure:5}, {Solarbeam: 10}, {Eruption: 5]}

{Fissure:5},

{Surf:15},

{Solarbeam: 10},

{Eruption: 5}

[

]

Moves

Não importa o moveset (se exise, se tem itens, moves futuros):

  • Pega elemento
  • Aplica função se convir
  • flatten
  • Permite que outra função seja chamada na sequencia

MONADS

"Meownads!" (créditos conjuntos com @_leticia)

Quick: Onde uso isso?

Sugestões e créditos:

  • @lafp (GIFs incríveis)
  • @bitemyapp, @argumatronic e @FunctionalWorks
  • @txustice - http://blog.txus.io/
  • http://www.amazon.com/Functional-Programming-Practice-Bruce-Maclennan/dp/0201137445/ref=sr_1_9?ie=UTF8&qid=1445967378&sr=8-9&keywords=functional+programming
  • http://media.eurucamp.org/ (@eurucamp)
  • @_leticia ('Meownads')
  • http://stackoverflow.com/questions/2704652/monad-in-plain-english-for-the-oop-programmer-with-no-fp-background

Obrigada! :)

Perguntas?

 

hannelita@gmail.com

@hannelita

pokemons_fp

By Hanneli Tavante (hannelita)

Loading comments...

More from Hanneli Tavante (hannelita)