O documento apresenta uma introdução à programação funcional para desenvolvedores com experiência em programação orientada a objetos. Resume os principais conceitos da programação funcional como funções puras, transparência referencial e imutabilidade de variáveis. Também discute vantagens como programação paralela e concorrente e como propor o uso de linguagens funcionais em empresas.
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
4. 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?
5. Introdução
Não importa quão longa é a sua
experiência como programador (júnior,
pleno ou sênior), 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.
6.
7. 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.
10. 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!
11. Lambda & Bloco de
Código
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 curryng.!
12. Lambda & Bloco de
Código
Calculando com Curryng !
!
( x ↦ ( y ↦ x*x + y*y) ) (5) !
!
= ( y ↦ 5*5 + y*y) (2)!
!
= 5*5 + 2*2 = 29 !
!
!
13. Contexto Histórico: LISP
Lisp - List Processing!
!
John McCarty - 1958!
!
Motivação processamento de Listas!
!
Lambda Calculus!
!
16. Functional Programming
Em uma função matemática, 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;
17. Functional Programming
Em uma função matemática, 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!
18. Functional Programming
! Programs using only pure functions.
! Functions that have no side effects.
! Concept of Referential Transparency.
19. Functional Programming
! Programs using only pure functions.
! Functions that have no side effects.
! Concept of Referential Transparency.
! Evitar mutações. VARIÁVEIS IMUTÁVEIS!
! Ter uma maneira poderosa de abstrair e compor
funções.
20. 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. VARIÁVEIS IMUTÁVEIS!
! Ter uma maneira poderosa de abstrair e compor
funções.
35. Functional Programming! Existem duas abordagens da programação funcional: Restrita e Amplo.
! Restrita: programar SEM: atribuições (variáveis imutáveis), 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.
58. Tail Recursion
! Se você tem uma função recursiva que chama a sí
mesma como última 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.
59. 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.
61. 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.
63. 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”.
64. 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!"
66. 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!”