Resolvendo problemas de forma funcional com F#

540 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
540
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Resolvendo problemas de forma funcional com F#

  1. 1. Resolvendo problemas de forma funcional com F# Vinicius Hana @vinicius_hana vinicius.hana@lambda3.com.br www.lambda3.com.br
  2. 2. Agenda• Jabá da Lambda3• Imperativo• Declarativo• F#• FizzBuzz• Fibonacci• Inversão de string• Considerações finais
  3. 3. Jabá da Lambda3• Democracia organizacional• Sem gerentes (!)• Transparência total• Completamente ágil
  4. 4. Imperativo• Orientação a objetos• Mutabilidade• Sentenças para manipulação de estado• Efeitos colaterais
  5. 5. private int _estado = 0;public void SomaAoEstado(int i){ _estado += i; Sem retorno,} obrigatoriamente manipula algo senão é inútil
  6. 6. Declarativo• Programação functional• Imutabilidade• Expressão de lógica sem ditar controle• Sem efeitos colaterais
  7. 7. <html> <head> <!-- --> </head> <body> <p>Um parágrafo</p> </body></html>
  8. 8. F#• Declarativa por padrão (imutabilidade)• Imperativa por opção (mutabilidade)• Funcionalmente impura• Puras não permitem mutabilidade – Haskell
  9. 9. let mutable numeroMut = 1numeroMut <- numeroMut + 1// Compila e roda normalmentelet numero = 1numero <- numero + 1// Não compila
  10. 10. Disclaimer Exemplos canônicos!Existem implementações melhores!
  11. 11. FizzBuzz• Famoso em dojos• Extremamente simples• Se divisível por 3, “Fizz”• Se divisível por 5, “Buzz”• Se disivível por ambos, “FizzBuzz”• Jogo para bêbados: quem erra, bebe…
  12. 12. public static class Fizzbuzz{ public static IEnumerable<string> Calc(int n) { for (int i = 1; i < n; i++) { var value = ""; if (i % 3 == 0) { value = "Fizz"; } if (i % 5 == 0) { value += "Buzz"; } yield return value == "" ? i.ToString() : value; } }}
  13. 13. module Fizzbuzz Sequencelet fizzbuzz (n: int) = comprehension seq { for x in 0..n do match (x % 3, x % 5) with | (0, 0) -> yield "FizzBuzz" | (0, _) -> yield "Fizz" Pattern | (_, 0) -> yield "Buzz"matching | _ -> yield x.ToString() }
  14. 14. Fibonacci• Tambem famoso em dojos• Tambem extremamente simples• N = (N – 1) + (N – 2)• 0, 1, 1, 2, 3, 5, 8, 13, 21…• Harmonias e proporções na natureza
  15. 15. public static class Fibonacci{ public static IEnumerable<int> Calc(int n) { for (int i = 0; i < n; i++) { if (i > 2) { yield return (i - 1) + (i - 2); } else { yield return i; } } }}
  16. 16. module Fibonacci unfoldlet fibonacci n = Seq.unfold Discriminated unions (fun (x, y) -> if (x > n) then Nonelambda else Some(x, (y, x + y)) ) (0, 1)
  17. 17. Inversão de string• Preciso explicar…?
  18. 18. public static class StringInv{ public static string Do(string s) { var inverted = ""; for (int i = s.Length; i > 0; i--) { inverted += s[i]; } return inverted; }}
  19. 19. module StringInvlet rec stringinv (s: List<char>) = match s with | [] -> s | [a;b] -> [b;a] | head :: tail -> stringinv tail @ [head]recursão
  20. 20. Considerações finais• Salvaguardas funcionais: – Lazy evaluation – Transparência referencial – Recursão em cauda – Paralelismo – Monads
  21. 21. Dúvidas?Confusões?
  22. 22. Obrigado! Vinicius Hana @vinicius_hanavinicius.hana@lambda3.com.br www.lambda3.com.br

×