Functional Programming - Scala

70
Functional Programming for “Old” Object Oriented Developers

description

Functional Programming - Scala

Transcript of Functional Programming - Scala

Page 1: Functional Programming - Scala

Functional Programming for

“Old” Object Oriented Developers

Page 2: Functional Programming - Scala

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.

Page 3: Functional Programming - Scala

Quem somos nós

Page 4: Functional Programming - Scala

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.

Page 5: Functional Programming - Scala

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.

Page 6: Functional Programming - Scala
Page 7: Functional Programming - Scala

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.

Page 8: Functional Programming - Scala

Imperative Programming Arquitetura de John Von Neuman

Norteou as linguagens de programação.

Page 9: Functional Programming - Scala

Funções Contexto Histórico:

René Descartes - “Penso logo existo!”!! !!!! ! ! Discurso do Método!! f ( x ) = x + 1! !

Page 10: Functional Programming - Scala

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 recurs ivas 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!

Page 11: Functional Programming - Scala

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.!

Page 12: Functional Programming - Scala

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 !

! !

Page 13: Functional Programming - Scala

Contexto Histórico: LISP Lisp - List Processing!

!John McCarty - 1958!

!Motivação processamento de Listas!

!Lambda Calculus!

!

Page 14: Functional Programming - Scala

Functional Programming

Page 15: Functional Programming - Scala

Functional Programming Em uma função matemática, os coeficientes não mudam. (a*x + b) + (c*x + d) = (a+c)*x + (b+d)

Page 16: Functional Programming - Scala

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;

Page 17: Functional Programming - Scala

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!

Page 18: Functional Programming - Scala

Functional Programming !   Programs using only pure functions. !   Functions that have no side effects. !   Concept of Referential Transparency.

Page 19: Functional Programming - Scala

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.

Page 20: Functional Programming - Scala

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.

Page 21: Functional Programming - Scala

Functional Programming

Page 22: Functional Programming - Scala

Functional Programming

Page 23: Functional Programming - Scala

Functional Programming !   Parallel Programming: !   Execute programs faster on parallel hardware

!   Concurrent Programming: !   Manage concurrent execution threads explicity

Page 24: Functional Programming - Scala

Functional Programming !   Parallel Programming: !   Execute programs faster on parallel hardware

!   Concurrent Programming: !   Manage concurrent execution threads explicity

BOTH ARE TO HARD!!!

Page 25: Functional Programming - Scala

Functional Programming

Page 26: Functional Programming - Scala

Functional Programming

Page 27: Functional Programming - Scala

Functional Programming

Page 28: Functional Programming - Scala

Functional Programming

Page 29: Functional Programming - Scala

Functional Programming

Page 30: Functional Programming - Scala

Functional Programming

Page 31: Functional Programming - Scala

Functional Programming

Page 32: Functional Programming - Scala

Functional Programming

Page 33: Functional Programming - Scala

Functional Programming

Page 34: Functional Programming - Scala

Functional Programming

Page 35: Functional Programming - Scala

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.

Page 36: Functional Programming - Scala

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(!)

Page 37: Functional Programming - Scala

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#

!   Clojure

Page 38: Functional Programming - Scala

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)!

Page 39: Functional Programming - Scala

Tail Recursion

Page 40: Functional Programming - Scala

Tail Recursion

Page 41: Functional Programming - Scala

Tail Recursion

Page 42: Functional Programming - Scala

Tail Recursion

Page 43: Functional Programming - Scala

Tail Recursion

Page 44: Functional Programming - Scala

Tail Recursion

Page 45: Functional Programming - Scala

Tail Recursion

Page 46: Functional Programming - Scala

Tail Recursion

Page 47: Functional Programming - Scala

Tail Recursion

Page 48: Functional Programming - Scala

Tail Recursion

Page 49: Functional Programming - Scala

Tail Recursion

Page 50: Functional Programming - Scala

Tail Recursion

Page 51: Functional Programming - Scala

Tail Recursion

Page 52: Functional Programming - Scala

Tail Recursion

Page 53: Functional Programming - Scala

Tail Recursion

Page 54: Functional Programming - Scala

Tail Recursion

Page 55: Functional Programming - Scala

Tail Recursion

Page 56: Functional Programming - Scala

Tail Recursion

Page 57: Functional Programming - Scala

Tail Recursion

Page 58: Functional Programming - Scala

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.

Page 59: Functional Programming - Scala

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.

Page 60: Functional Programming - Scala

Imperative and Functional Programming !   Um anula o

outro? !   Qual é a melhor? !   Por que Scala?

Page 61: Functional Programming - Scala

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.

Page 62: Functional Programming - Scala

Imperative and Functional Programming !   Como propor o uso da linguagem funcional

em sua empresa?

Page 63: Functional Programming - Scala

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”.

Page 64: Functional Programming - Scala

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!"

Page 65: Functional Programming - Scala

Imperative and Functional Programming

Page 66: Functional Programming - Scala

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!”

Page 67: Functional Programming - Scala

Imperative and Functional Programming

Page 68: Functional Programming - Scala

Conclusão

Page 69: Functional Programming - Scala

Perguntas e Contato !   ALAN VIDOTTI PRANDO

!   Linkedin: http://www.linkedin.com/in/avprando

!   Twitter: @alanprando

!   E-mail: [email protected]

!   JOSE RENATO PEQUENO

!   Linkedin: br.linkedin.com/pub/jose-renato-pequeno/28/524/244/

!   Twitter: @javalittle

!   E-mail: [email protected]

Page 70: Functional Programming - Scala

Referências http://pt.wikipedia.org/wiki/Cálculo_lambda

http://www.inf.pucrs.br/~gustavo/disciplinas/pli/material/paradigmas-aula09.pdf

http://pt.wikipedia.org/wiki/

Arquitetura_de_von_Neumann

https://fit.faccat.br/~guto/artigos/Artigo_Paradigmas_de_Programacao.pdf

http://hudsoncosta.files.wordpress.com/2011/05/

programacao_funcional.pdf

http://pt.wikipedia.org/wiki/Cálculo_lambda