SlideShare uma empresa Scribd logo
1 de 76
Baixar para ler offline
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 & 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
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
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
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
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 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
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á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
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
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
Contexto Histórico: LISP
Lisp - List Processing
John McCarty - 1958
Motivação processamento de Listas
Lambda Calculus
Saturday, July 13, 13
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)
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)
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
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
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
Functional Programming
Programs using only pure functions.
Functions that have no side effects.
Concept of Referential Transparency.
Saturday, July 13, 13
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
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
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
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
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 concurrent execution threads explicity
Saturday, July 13, 13
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
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, f: Int => Int): Int =
if (a>b) 0 else f(a) + soma(a+1, b, f)
exemploSoma(1, 10, funcQ)
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
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 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
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
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 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
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 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
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
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 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
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 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
Books
Saturday, July 13, 13
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

Mais conteúdo relacionado

Mais procurados

Por que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisPor que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisLuiz Borba
 
Paradigmas de Linguagens de Programacao- Aula #8
Paradigmas de Linguagens de Programacao- Aula #8Paradigmas de Linguagens de Programacao- Aula #8
Paradigmas de Linguagens de Programacao- Aula #8Ismar Silveira
 
Paradigmas de Linguagens de Programação - Tipos primitivos e compostos
Paradigmas de Linguagens de Programação - Tipos primitivos e compostosParadigmas de Linguagens de Programação - Tipos primitivos e compostos
Paradigmas de Linguagens de Programação - Tipos primitivos e compostosAdriano Teixeira de Souza
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em pythonAlvaro Oliveira
 
E:\Plp 2009 2\Plp Aula11
E:\Plp 2009 2\Plp Aula11E:\Plp 2009 2\Plp Aula11
E:\Plp 2009 2\Plp Aula11Ismar Silveira
 

Mais procurados (9)

Por que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisPor que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionais
 
Paradigmas de Linguagens de Programacao- Aula #8
Paradigmas de Linguagens de Programacao- Aula #8Paradigmas de Linguagens de Programacao- Aula #8
Paradigmas de Linguagens de Programacao- Aula #8
 
Haskell
HaskellHaskell
Haskell
 
Linguagem Go
Linguagem GoLinguagem Go
Linguagem Go
 
Paradigmas de Linguagens de Programação - Tipos primitivos e compostos
Paradigmas de Linguagens de Programação - Tipos primitivos e compostosParadigmas de Linguagens de Programação - Tipos primitivos e compostos
Paradigmas de Linguagens de Programação - Tipos primitivos e compostos
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em python
 
E:\Plp 2009 2\Plp Aula11
E:\Plp 2009 2\Plp Aula11E:\Plp 2009 2\Plp Aula11
E:\Plp 2009 2\Plp Aula11
 
Pilhas e Filas
Pilhas e FilasPilhas e Filas
Pilhas e Filas
 
Programacao funcional
Programacao funcionalProgramacao funcional
Programacao funcional
 

Destaque

Elhombrem[1].
Elhombrem[1]. Elhombrem[1].
Elhombrem[1]. jose cruz
 
Agent based software development
Agent based software developmentAgent based software development
Agent based software developmentAlan Prando
 
Evaluacion de instituciones
Evaluacion de institucionesEvaluacion de instituciones
Evaluacion de institucionesAdalberto
 
Inside the MOOC – An argumentation analysis of MOOC Implementation strategies
Inside the MOOC – An argumentation analysis of MOOC Implementation strategiesInside the MOOC – An argumentation analysis of MOOC Implementation strategies
Inside the MOOC – An argumentation analysis of MOOC Implementation strategiesFernUniversität in Hagen
 
Logros iii trimestre
Logros iii trimestreLogros iii trimestre
Logros iii trimestreAdalberto
 
Logros iii trimestre 2016. mario, carlos y ricardo
Logros iii trimestre 2016. mario, carlos y ricardoLogros iii trimestre 2016. mario, carlos y ricardo
Logros iii trimestre 2016. mario, carlos y ricardoAdalberto
 
Boleta monitoreo mined 2016
Boleta monitoreo mined 2016Boleta monitoreo mined 2016
Boleta monitoreo mined 2016Adalberto
 

Destaque (9)

Isl 7
Isl 7Isl 7
Isl 7
 
Elhombrem[1].
Elhombrem[1]. Elhombrem[1].
Elhombrem[1].
 
Impuls Wille
Impuls WilleImpuls Wille
Impuls Wille
 
Agent based software development
Agent based software developmentAgent based software development
Agent based software development
 
Evaluacion de instituciones
Evaluacion de institucionesEvaluacion de instituciones
Evaluacion de instituciones
 
Inside the MOOC – An argumentation analysis of MOOC Implementation strategies
Inside the MOOC – An argumentation analysis of MOOC Implementation strategiesInside the MOOC – An argumentation analysis of MOOC Implementation strategies
Inside the MOOC – An argumentation analysis of MOOC Implementation strategies
 
Logros iii trimestre
Logros iii trimestreLogros iii trimestre
Logros iii trimestre
 
Logros iii trimestre 2016. mario, carlos y ricardo
Logros iii trimestre 2016. mario, carlos y ricardoLogros iii trimestre 2016. mario, carlos y ricardo
Logros iii trimestre 2016. mario, carlos y ricardo
 
Boleta monitoreo mined 2016
Boleta monitoreo mined 2016Boleta monitoreo mined 2016
Boleta monitoreo mined 2016
 

Semelhante a Functional Programming for “Old” OO Devs in chars

TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...tdc-globalcode
 
Minicurso - funcional (CTI/2019)
Minicurso - funcional (CTI/2019)Minicurso - funcional (CTI/2019)
Minicurso - funcional (CTI/2019)Pedro Alcantara
 
javascript_funcional.pdf
javascript_funcional.pdfjavascript_funcional.pdf
javascript_funcional.pdfronaldo ramos
 
Programação Funcional - Luiz Stangarlin
Programação Funcional - Luiz StangarlinProgramação Funcional - Luiz Stangarlin
Programação Funcional - Luiz StangarlinDev PP
 
JDK8: Lambda, Jigsaw e novidades
JDK8: Lambda, Jigsaw e novidadesJDK8: Lambda, Jigsaw e novidades
JDK8: Lambda, Jigsaw e novidadesEder Magalhães
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaSérgio Souza Costa
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?Denis Costa
 

Semelhante a Functional Programming for “Old” OO Devs in chars (20)

Functional Programming - Scala
Functional Programming - ScalaFunctional Programming - Scala
Functional Programming - Scala
 
Calourada2010
Calourada2010Calourada2010
Calourada2010
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem Python
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
 
Minicurso - funcional (CTI/2019)
Minicurso - funcional (CTI/2019)Minicurso - funcional (CTI/2019)
Minicurso - funcional (CTI/2019)
 
javascript_funcional.pdf
javascript_funcional.pdfjavascript_funcional.pdf
javascript_funcional.pdf
 
Programação Funcional - Luiz Stangarlin
Programação Funcional - Luiz StangarlinProgramação Funcional - Luiz Stangarlin
Programação Funcional - Luiz Stangarlin
 
JDK8: Lambda, Jigsaw e novidades
JDK8: Lambda, Jigsaw e novidadesJDK8: Lambda, Jigsaw e novidades
JDK8: Lambda, Jigsaw e novidades
 
Ruby versus Python
Ruby versus PythonRuby versus Python
Ruby versus Python
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo Lua
 
Pythonfuncional
PythonfuncionalPythonfuncional
Pythonfuncional
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
 
1.1.paradigmas
1.1.paradigmas1.1.paradigmas
1.1.paradigmas
 
Javascript
Javascript Javascript
Javascript
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 
Programação Lógica com Restrições
Programação Lógica com RestriçõesProgramação Lógica com Restrições
Programação Lógica com Restrições
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
JavaScript - A Linguagem
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A Linguagem
 
Haskell
HaskellHaskell
Haskell
 

Functional Programming for “Old” OO Devs in chars