Functional Programming - Scala

Post on 22-Jun-2015

177 views 0 download

description

Functional Programming - Scala

Transcript of Functional Programming - Scala

Functional Programming for

“Old” Object Oriented Developers

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.

Quem somos nós

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.

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.

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.

Imperative Programming Arquitetura de John Von Neuman

Norteou as linguagens de programação.

Funções Contexto Histórico:

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

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!

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

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 !

! !

Contexto Histórico: LISP Lisp - List Processing!

!John McCarty - 1958!

!Motivação processamento de Listas!

!Lambda Calculus!

!

Functional Programming

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

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;

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!

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

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.

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.

Functional Programming

Functional Programming

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

!   Concurrent Programming: !   Manage concurrent execution threads explicity

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

!   Concurrent Programming: !   Manage concurrent execution threads explicity

BOTH ARE TO HARD!!!

Functional Programming

Functional Programming

Functional Programming

Functional Programming

Functional Programming

Functional Programming

Functional Programming

Functional Programming

Functional Programming

Functional Programming

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.

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

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

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

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

Tail Recursion

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.

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.

Imperative and Functional Programming !   Um anula o

outro? !   Qual é a melhor? !   Por que 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.

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

em sua empresa?

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

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

Imperative and Functional Programming

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

Imperative and Functional Programming

Conclusão

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

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