Functional
Programming for
“Old” Object Oriented
Developers
Saturday, July 13, 13
Quem somos nós
Alan Vidotti Prando
Mestrando em Engenharia da Computação - IPT/USP.
8 anos de experiência com JAVA, RUBY &...
Quem somos nós
Saturday, July 13, 13
Roteiro
Saturday, July 13, 13
Roteiro
Paradigma Programação
Imperativa.
Contexto Histórico: Lambda
Calculus, LISP.
Conceitos de Programação
Funcional
Po...
Introdução
Não importa quão longa é a sua experiência
como programador (junior, pleno ou senior),
aprender programação fun...
Saturday, July 13, 13
Introdução
From primitive assembly languages
(which were at least a step up from raw
machine code) there grew a plethora o...
Imperative Programming
Arquitetura de John Von Neuman
Norteou as linguagens de programação.
Saturday, July 13, 13
Funções Contexto
Histórico:
René Descartes - “Penso logo existo!”
Discurso do Método
f ( x ) = x + 1
Saturday, July 13, 13
Contexto Histórico:
Lambda Calculus
Na lógica matemática e na ciência da computação, cálculo lambda,
também escrito como c...
Lambda
Função Nomeada SomaQuadrados(x,y) = x*x + y * y
SomaQuadrados(5,2) = 5*5 + 2*2 = 29
Função Anônima (x,y) ↦ x*x + y*...
Lambda
Calculando com Curriyng
( x ↦ ( y ↦ x*x + y*y) ) (5) (2)
= ( y ↦ 5*5 + y*y) (2)
= 5*5 + 2*2 = 29
Saturday, July 13,...
Contexto Histórico: LISP
Lisp - List Processing
John McCarty - 1958
Motivação processamento de Listas
Lambda Calculus
Satu...
Functional Programming
Saturday, July 13, 13
Functional Programming
Em uma função matematica, os coeficientes não mudam.
(a*x + b) + (c*x + d) = (a+c)*x + (b+d)
Saturd...
Functional Programming
Em uma função matematica, os coeficientes não mudam.
(a*x + b) + (c*x + d) = (a+c)*x + (b+d)
Já na ...
Functional Programming
Em uma função matematica, os coeficientes não mudam.
(a*x + b) + (c*x + d) = (a+c)*x + (b+d)
Já na ...
Functional Programming
Existem duas abordagens da programação funcional: Restrita e Amplo.
Restrita: programar SEM: atribu...
Functional Programming
Programs using only pure functions.
Functions that have no side effects.
Concept of Referential Tra...
Functional Programming
Programs using only pure functions.
Functions that have no side effects.
Concept of Referential Tra...
Functional Programming
Programs using only pure functions.
Functions that have no side effects.
Concept of Referential Tra...
Functional Programming
Linguagens restritas:
Pure Lisp, XSLT, Xpath, Xquery, FP
Haskell (sem I/O Mondas ou UnsafePerformIO...
Functional Programming
1959 - LISP
1975-77 - ML, FP, Scheme
1978 - Smalltalk
1986 - Standard ML
1990 - Haskell, Erlang
199...
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Parallel Programming:
Execute programs faster on parallel hardware
Concurrent Programming:
Manage c...
Functional Programming
Parallel Programming:
Execute programs faster on parallel hardware
Concurrent Programming:
Manage c...
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
Functional Programming
Saturday, July 13, 13
High-Order Functions
Funções que recebem funções como parâmetros
def funcQ(x : Int) = x * x
def exemploSoma(a: Int, b: Int...
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Saturday, July 13, 13
Tail Recursion
Se você tem uma função recursiva que chama a sí
mesma como ultima ação, você consegue reutilizar o
stack fr...
Pattern Matching
So pattern matching helps you decompose and navigate data
structures in a very convenient, compact syntax...
Imperative and Functional
Programming
Um anula o outro?
Qual é a melhor?
Por que Scala?
Saturday, July 13, 13
Imperative and Functional
Programming
Têndencia ou realidade?
First class functions have slowly been added to mainstream l...
Imperative and Functional
Programming
Como propor o uso da linguagem funcional em
sua empresa?
Saturday, July 13, 13
Imperative and Functional
Programming
Como propor o uso da linguagem funcional em
sua empresa?
Tenho um problema que faz s...
Imperative and Functional
Programming
Como propor o uso da linguagem funcional em
sua empresa?
Tenho um problema que faz s...
Imperative and Functional
Programming
Saturday, July 13, 13
Imperative and Functional
Programming
Como propor o uso da linguagem funcional em
sua empresa?
Tenho um problema que faz s...
Imperative and Functional
Programming
Saturday, July 13, 13
Conclusão
“Sou desenvolvedor JAVA, adoro escrever getters e
setters igual um maluco e amo JVM”. Utilize SCALA!
“Java é uma...
Books
Saturday, July 13, 13
Perguntas e Contato
ALAN VIDOTTI PRANDO
Linkedin: http://www.linkedin.com/in/avprando
Twitter: @alanprando
E-mail: alan.pr...
Upcoming SlideShare
Loading in...5
×

Functional programming for Old Object Oriented Developers

341

Published on

TDC2013 - Trilha SCALA - Functional programming for Old Object Oriented Developers

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

No Downloads
Views
Total Views
341
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Functional programming for Old Object Oriented Developers

  1. 1. Functional Programming for “Old” Object Oriented Developers Saturday, July 13, 13
  2. 2. Quem somos nós Alan Vidotti Prando Mestrando em Engenharia da Computação - IPT/USP. 8 anos de experiência com JAVA, RUBY & SCALA. SCJP, SCWCD e SCBCD. Jose Renato Pequeno Graduado em Tecnologia em Informática - FASP (2005), Pós graduação em Gerenciamento de Projetos - FGV. MBA em arquitetura de soluções - FIAP . Trabalhou como professor ministrando aulas na Universidade Metodista de São Paulo, para os cursos de Análise e Desenvolvimento de Sistemas, Engenharia da Computação com Ênfase em Software e Sistemas de Informação. Saturday, July 13, 13
  3. 3. Quem somos nós Saturday, July 13, 13
  4. 4. Roteiro Saturday, July 13, 13
  5. 5. Roteiro Paradigma Programação Imperativa. Contexto Histórico: Lambda Calculus, LISP. Conceitos de Programação Funcional Por que Programação Funcional? Técnicas e implementações funcionais (em Scala): Elementos básicos: Lambda, Clousure & Bloco de códigos Higher-Order Functions Tail Recursion Currying Pattern Matching. Misturando paradigmas funcionais e imperativos: Quais são as vantagens? O que o Oderksy propôs ao criar o Scala? É possível de trazer isso para o nosso dia a dia? Conclusão e dúvidas. Saturday, July 13, 13
  6. 6. Introdução Não importa quão longa é a sua experiência como programador (junior, pleno ou senior), aprender programação funcional é um desafio. Esteja preparado para ser um “junior” novamente. Livro: Functional Programming in Scala. Nós gostaríamos que você fizesse uma “pausa” e esqueça o que você sabe sobre programação. Olhem para os exemplos com a menta aberta. Curso: Functional Programming in Scala. Martin Odersky. COURSERA. Saturday, July 13, 13
  7. 7. Saturday, July 13, 13
  8. 8. Introdução From primitive assembly languages (which were at least a step up from raw machine code) there grew a plethora of high-level programming languages, beginning with FORTRAN in the 1950s. The development of these languages grew so rapidly that by the 1980s they were best characterized by grouping them into families that reflected a common computation model or programming style. Debates over which language or family of languages is best will undoubtedly persist for as long as computers need programmers. Fonte: Conception, Evolution, and Application of Functional Programming Languages. PAUL HUDAK, Yale University. 1989. Saturday, July 13, 13
  9. 9. Imperative Programming Arquitetura de John Von Neuman Norteou as linguagens de programação. Saturday, July 13, 13
  10. 10. Funções Contexto Histórico: René Descartes - “Penso logo existo!” Discurso do Método f ( x ) = x + 1 Saturday, July 13, 13
  11. 11. Contexto Histórico: Lambda Calculus Na lógica matemática e na ciência da computação, cálculo lambda, também escrito como cálculo-λ é um sistema formal que estuda funções recursivas computáveis, no que se refere a teoria da computabilidade, e fenômenos relacionados, como variáveis ligadas e substituição. Sua principal característica são as entidades que podem ser utilizadas como argumentos e retornadas como valores de outras funções. Alonzo Church - 1930 Saturday, July 13, 13
  12. 12. Lambda Função Nomeada SomaQuadrados(x,y) = x*x + y * y SomaQuadrados(5,2) = 5*5 + 2*2 = 29 Função Anônima (x,y) ↦ x*x + y*y Qualquer função que recebe duas ou mais entradas, pode ser reelaborada em uma função que recebe uma única entrada e tem como saída uma outra função. x ↦ ( y ↦ x*x + y*y) Esta transformação é chamada de currying. Saturday, July 13, 13
  13. 13. Lambda Calculando com Curriyng ( x ↦ ( y ↦ x*x + y*y) ) (5) (2) = ( y ↦ 5*5 + y*y) (2) = 5*5 + 2*2 = 29 Saturday, July 13, 13
  14. 14. Contexto Histórico: LISP Lisp - List Processing John McCarty - 1958 Motivação processamento de Listas Lambda Calculus Saturday, July 13, 13
  15. 15. Functional Programming Saturday, July 13, 13
  16. 16. Functional Programming Em uma função matematica, os coeficientes não mudam. (a*x + b) + (c*x + d) = (a+c)*x + (b+d) Saturday, July 13, 13
  17. 17. Functional Programming Em uma função matematica, os coeficientes não mudam. (a*x + b) + (c*x + d) = (a+c)*x + (b+d) Já na programação imperativa você pode fazer isso! E isso não é permitido pela lei da matematica! class Polynomial {double[] doefficient; } Polynomial p = ….; p.coefficient[0] = 42; Saturday, July 13, 13
  18. 18. Functional Programming Em uma função matematica, os coeficientes não mudam. (a*x + b) + (c*x + d) = (a+c)*x + (b+d) Já na programação imperativa você pode fazer isso! E isso não é permitido pela lei da matematica! class Polynomial {double[] doefficient; } Polynomial p = ….; p.coefficient[0] = 42; Se você quiser implementar conceitos matemáticos de alto nível seguindo as teorias matematicas, você não poderá utilizar mutações! Saturday, July 13, 13
  19. 19. Functional Programming Existem duas abordagens da programação funcional: Restrita e Amplo. Restrita: programar SEM: atribuições (variaveis imutaveis), loops, if- then-else. Amplo: Foco na função. A linguagem permite construção de programas “elegantes” com foco em funções. Funções podem ser: declaradas em qualquer lugar. Passadas como parâmetro para outras funções, bem como retornar como resultado de uma função. Deve haver operadores padrões na linguagem para trabalhar com funções de maneira simples. Saturday, July 13, 13
  20. 20. Functional Programming Programs using only pure functions. Functions that have no side effects. Concept of Referential Transparency. Saturday, July 13, 13
  21. 21. Functional Programming Programs using only pure functions. Functions that have no side effects. Concept of Referential Transparency. Evitar mutações. VARIAVEIS IMUTAVEIS! Ter uma maneira poderosa de abstrair e compor funções. Saturday, July 13, 13
  22. 22. Functional Programming Programs using only pure functions. Functions that have no side effects. Concept of Referential Transparency. Programação Funcional: foco nas funções. Programação imperativa: foco no estado. Evitar mutações. VARIAVEIS IMUTAVEIS! Ter uma maneira poderosa de abstrair e compor funções. Saturday, July 13, 13
  23. 23. Functional Programming Linguagens restritas: Pure Lisp, XSLT, Xpath, Xquery, FP Haskell (sem I/O Mondas ou UnsafePerformIO) Linguagens amplas: Lisp, Scheme, Racket, Clojure SML, Ocaml, F# Haskell (full language) Scala Smalltalk, Ruby(!), Javascript(!) Saturday, July 13, 13
  24. 24. Functional Programming 1959 - LISP 1975-77 - ML, FP, Scheme 1978 - Smalltalk 1986 - Standard ML 1990 - Haskell, Erlang 1999 - XSLT 2000 - Ocaml 2003 - Scala, Xquery 2005 - F# Saturday, July 13, 13
  25. 25. Functional Programming Saturday, July 13, 13
  26. 26. Functional Programming Saturday, July 13, 13
  27. 27. Functional Programming Saturday, July 13, 13
  28. 28. Functional Programming Saturday, July 13, 13
  29. 29. Functional Programming Saturday, July 13, 13
  30. 30. Functional Programming Saturday, July 13, 13
  31. 31. Functional Programming Saturday, July 13, 13
  32. 32. Functional Programming Parallel Programming: Execute programs faster on parallel hardware Concurrent Programming: Manage concurrent execution threads explicity Saturday, July 13, 13
  33. 33. Functional Programming Parallel Programming: Execute programs faster on parallel hardware Concurrent Programming: Manage concurrent execution threads explicity BOTH ARE TO HARD!!! Saturday, July 13, 13
  34. 34. Functional Programming Saturday, July 13, 13
  35. 35. Functional Programming Saturday, July 13, 13
  36. 36. Functional Programming Saturday, July 13, 13
  37. 37. Functional Programming Saturday, July 13, 13
  38. 38. Functional Programming Saturday, July 13, 13
  39. 39. Functional Programming Saturday, July 13, 13
  40. 40. Functional Programming Saturday, July 13, 13
  41. 41. Functional Programming Saturday, July 13, 13
  42. 42. Functional Programming Saturday, July 13, 13
  43. 43. Functional Programming Saturday, July 13, 13
  44. 44. High-Order Functions Funções que recebem funções como parâmetros def funcQ(x : Int) = x * x def exemploSoma(a: Int, b: Int, f: Int => Int): Int = if (a>b) 0 else f(a) + soma(a+1, b, f) exemploSoma(1, 10, funcQ) Saturday, July 13, 13
  45. 45. Tail Recursion Saturday, July 13, 13
  46. 46. Tail Recursion Saturday, July 13, 13
  47. 47. Tail Recursion Saturday, July 13, 13
  48. 48. Tail Recursion Saturday, July 13, 13
  49. 49. Tail Recursion Saturday, July 13, 13
  50. 50. Tail Recursion Saturday, July 13, 13
  51. 51. Tail Recursion Saturday, July 13, 13
  52. 52. Tail Recursion Saturday, July 13, 13
  53. 53. Tail Recursion Saturday, July 13, 13
  54. 54. Tail Recursion Saturday, July 13, 13
  55. 55. Tail Recursion Saturday, July 13, 13
  56. 56. Tail Recursion Saturday, July 13, 13
  57. 57. Tail Recursion Saturday, July 13, 13
  58. 58. Tail Recursion Saturday, July 13, 13
  59. 59. Tail Recursion Saturday, July 13, 13
  60. 60. Tail Recursion Saturday, July 13, 13
  61. 61. Tail Recursion Saturday, July 13, 13
  62. 62. Tail Recursion Saturday, July 13, 13
  63. 63. Tail Recursion Saturday, July 13, 13
  64. 64. Tail Recursion Se você tem uma função recursiva que chama a sí mesma como ultima ação, você consegue reutilizar o stack frame da execução dessa função. Isso se chama TAIL RECURSION. Isso aumenta a eficiência da execução, sendo idêntica a eficiência de um loop. Na definição, Tail Recursion poderia acontecer mesmo se a chamada ocorresse para outra função, não sendo necessário a função ser chamada por ela mesma. Saturday, July 13, 13
  65. 65. Pattern Matching So pattern matching helps you decompose and navigate data structures in a very convenient, compact syntax, it enables the compiler to check the logic of your code, at least a little bit. The act of checking a perceived sequence of tokens for the presence of the constituents of some pattern. Saturday, July 13, 13
  66. 66. Imperative and Functional Programming Um anula o outro? Qual é a melhor? Por que Scala? Saturday, July 13, 13
  67. 67. Imperative and Functional Programming Têndencia ou realidade? First class functions have slowly been added to mainstream languages. In 1994, support for lambda, filter, map, and reduce was added to Python. First class functions were also introduced in PHP 5.3, Visual Basic 9, C# 3.0, and C++11. In Java, anonymous classes can sometimes be used to simulate closures; however, anonymous classes are not always proper replacements to closures because they have more limited capabilities. Java 8 will support lambda expressions as a replacement for some anonymous classes. Saturday, July 13, 13
  68. 68. Imperative and Functional Programming Como propor o uso da linguagem funcional em sua empresa? Saturday, July 13, 13
  69. 69. Imperative and Functional Programming Como propor o uso da linguagem funcional em sua empresa? Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”. Saturday, July 13, 13
  70. 70. Imperative and Functional Programming Como propor o uso da linguagem funcional em sua empresa? Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”. Jeito ERRADO: “Scala é uma linguagem nova e com conceitos legais! Híbrida, OO e funcional. O código fica bem menos verborrágico. Além de ser divertido passar e receber funções como parâmetro! Vamos utilizar!" Saturday, July 13, 13
  71. 71. Imperative and Functional Programming Saturday, July 13, 13
  72. 72. Imperative and Functional Programming Como propor o uso da linguagem funcional em sua empresa? Tenho um problema que faz sentido usar PF ao invés de PI. “Preciso atender a 1 milhão de requisições simultâneas. Tenho um data center matador e meu software precisa trabalhar de maneira concorrente e paralela”. Jeito CERTO: “Vamos atender mais usuários sem precisar gastar com infraestrutura. Nosso ambiente (JVM), já esta pronto para isso. O sistema vai processar mais vendas e consequentemente lucraremos mais!” Saturday, July 13, 13
  73. 73. Imperative and Functional Programming Saturday, July 13, 13
  74. 74. Conclusão “Sou desenvolvedor JAVA, adoro escrever getters e setters igual um maluco e amo JVM”. Utilize SCALA! “Java é uma porcaria! Odeio a JVM! Fica bem mais rápido e leve (e colorido) com Ruby”. Utilize ERLANG! SE faz sentido. POR QUE NÃO? Tire proveito do Hardware! Faça mais simples! lembre-se: Manutenabilidade faz parte da QUALIDADE do SOFTWARE. No final das contas o que importa é código lipo, modular e reutilizável. EVITE RETRABALHO! Saturday, July 13, 13
  75. 75. Books Saturday, July 13, 13
  76. 76. Perguntas e Contato ALAN VIDOTTI PRANDO Linkedin: http://www.linkedin.com/in/avprando Twitter: @alanprando E-mail: alan.prando@gmail.com JOSE RENATO PEQUENO Linkedin: br.linkedin.com/pub/jose-renato-pequeno/28/524/244/ Twitter: @javalittle E-mail: jrpequeno@hotmail.com Saturday, July 13, 13
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×