Técnicas de programação funcional

38
Técnicas de Programação Funcional Em F# e Scala Vinícius Hana e Juliano Alves @vinicius_hana e @vonjuliano

Transcript of Técnicas de programação funcional

Page 1: Técnicas de programação funcional

Técnicas de Programação

Funcional

Em F# e Scala

Vinícius Hana e Juliano Alves

@vinicius_hana e @vonjuliano

Page 2: Técnicas de programação funcional

Apresentação

Page 3: Técnicas de programação funcional

Primeiro de tudo: não são paradigmas excludentes!

Page 4: Técnicas de programação funcional

Programação funcional considera que todas as operações são funções

Page 5: Técnicas de programação funcional

Todas as operações são funções

def f(x: Int, g: (Int) => Int) = g(x) + 3def g(x: Int) = x * 2

val resultado = f(4, g) // isso dá 11

5

Page 6: Técnicas de programação funcional

Isso tem nome: funções de alta ordem

Page 7: Técnicas de programação funcional

Perceberam que se parece com matemática?

Page 8: Técnicas de programação funcional

Todas as operações são funções

f(x) = x + 3

g(x) = x * 2

(f o g) = f(g(x)) = g(x) + 3

g(4) = 4 * 2 = 8 f(g(4)) = 8 +3 = 11

8

Page 9: Técnicas de programação funcional

Funções de alta ordem permitem algumas coisas bem legais!

Page 10: Técnicas de programação funcional

Funções de alta ordem

let funcao = let lista = [0;1;2;3;4]List.map (fun x -> x * 2) lista

10

Page 11: Técnicas de programação funcional

Agora, uma outra ideia:Dado f(x) = x + 1, se eu passar sempre 1, sempre vai dar 2?

Page 12: Técnicas de programação funcional

Sim!E isso tem nome: transparência referencial

Page 13: Técnicas de programação funcional

Dada a mesma entrada, obteremos sempre a mesma saídaOu seja, ausência de efeitos colaterais

Page 14: Técnicas de programação funcional

Dá pra fazer isso em programação?Sim, usando imutabilidade!

Page 15: Técnicas de programação funcional

Mutabilidade

public int Resultado { get; set; }

public void Dobrar(int numero){

Resultado *= 2;}

15

Page 16: Técnicas de programação funcional

Imutabilidade

DateTime.Now.AddDays(1);// retorna novo datetime com a adição feita

16

Page 17: Técnicas de programação funcional

Dada a mesma entrada, obteremos sempre a mesma saída

Page 18: Técnicas de programação funcional

Ou seja, ausência de efeitos colaterais – mais confiabilidade no código

Page 19: Técnicas de programação funcional

F# e Scala suportam mutabilidade e imutabilidade

Page 20: Técnicas de programação funcional

Imutabilidade em Scala e F#

let x = 1 // imutavellet mutable x = 1 // mutavel

val x = 1 // imutavelvar y = 1 // mutavel

20

Page 21: Técnicas de programação funcional

Isso ajuda demais em concorrência

Page 22: Técnicas de programação funcional

Certo, mas como eu manipulo e altero os itens de uma lista, então? Ela não é imutável?

Page 23: Técnicas de programação funcional

Simples: gere outra com nossa velha amiga recursão!

Page 24: Técnicas de programação funcional

Com recursão, podemos compor e decompor listas

Page 25: Técnicas de programação funcional

Recursão em listaslet rec reverse lista =

match lista with| head :: tail -> (reverse tail) @ [head]| [] -> []

def reverse[T](list: List[T]): List[T] = list match {  case head :: tail => reverse(tail) ++ List(head)  case Nil => Nil}

Page 26: Técnicas de programação funcional

Percebeu uma estrutura diferente para compor a lista?

Page 27: Técnicas de programação funcional

Essa estrutura se chama pattern matching

Page 28: Técnicas de programação funcional

Ela lembra switch-case, porém com muito mais funcionalidade

Page 29: Técnicas de programação funcional

Pattern matching

match coisa with| 1 | 3 -> …| head :: tail -> …| [] -> …| _ -> …

lista match {case 1 => …case head :: tail => …case Nil => …case _ => …

29

Page 30: Técnicas de programação funcional

E se eu iterar em uma lista gigantesca, ou mesmo infinita?

Page 31: Técnicas de programação funcional

Lista infinita? Isso não arrebentaria a memória?

Page 32: Técnicas de programação funcional

Não se você tiver lazy evaluation!

Page 33: Técnicas de programação funcional

Lazy evaluation

let x = 10let resultado = lazy (x + 10)

val x = { println("x"); 1 }lazy val y = { println("y"); 2 }

33

Page 34: Técnicas de programação funcional

Vamos juntar tudo isso em uma implementação de Fibonacci?

Page 35: Técnicas de programação funcional

Fibonacci

let rec fib n = match n with

| x when n > 2 -> 1| _ -> fib (n - 1) + fib (n - 2)

val seq: Stream[BigInt] = 0 #:: 1 #:: (seq zip seq.tail).map { case (a, b) => a + b }

def elemento(posicao: Int): BigInt = seq(posicao - 1)

35

Page 36: Técnicas de programação funcional

Referências

Page 37: Técnicas de programação funcional

Obrigado!

Vinícius Hana e Juliano Alves

@vinicius_hana e @vonjuliano

Page 38: Técnicas de programação funcional

www.lambda3.com.br