Programação funcional
E um pouco de JavaScript
Deivis C. Wingert
/DeivisWingert
/Deivis
“Programação funcional, assim como a orientação a
objetos, é uma forma de se pensar em como resolver
problemas”
Hoje
Nuvem
Servidores distribuídos
Programação concorrente
E funcional funciona ?
• A programação funcional ficou por anos fechada
ao meio acadêmico devido a complexidade
• Mas a cada dia isso vem mudando mais, as
linguagens funcionais como Erlang, Clojure,
Haskel, F# entre outras veem sendo cada vez
mais utilizadas
• Pode ser utilizada em linguagens multi-paradigma
como Scala e JavaScript.
Por que funcional ?
• Por que isso agora ? Se já convivo tanto com a
orientação a objetos no JavaScript
• O JavaScript não é nativamente orientado a
objetos e nem puramente funcional
Pedras no caminho
• A programação funcional vai parecer uma
loucura no começo pois estamos em nossa
maioria acostumados a trabalhar com a
orientação a objetos.
• Para se criar bons sistemas utilizando
JavaScript sobre o paradigma funcional é
necessária uma bela curva de aprendizado.
Um pouco de história
O que faz uma linguagem ser
funcional?
Funções == objeto
Imutabilidade
Recursividade
Lambda
Independência de estado
O que faz uma linguagem ser
funcional?
• Função é a menor parte de um programa
• Na programação funcional nos preocupamos
em dizer a maquina o que queremos fazer e
não como iremos fazer.
O que faz uma linguagem ser
funcional?
• A execução das expressões é controlada por
condições e recursividade e não iterações
diretas como ocorre nos paradigmas
imperativos.
• Variáveis e estados imutáveis.
Sobre o paradigma
• Funções não dependem do estado do sistema.
• Lambda: de maneira simples, é o conceito de
funções recebendo e retornando funções ou
resultados das mesmas, conceito oriundo do
cálculo Lambda do matemático Alonzo
Church.
Vantagens
Modularidade
Menos sujeito a efeitos colaterais
Menor dependência entre
módulos
Vantagens
Reusabilidade
Programação concorrente
É matematicamente correto
O JavaScript é funcional ?
• Em parte, pois sua construção
permite a utilização tanto de
programação funcional quanto de
orientação a objetos.
Tipos de funções
Funções anônimas
• São simplesmente funções que não tem um
nome definido.
• Sua utilização é bem comum quando temos
apenas uma chamada a esta determinada
função ou quando a retornamos como
parâmetro.
Funções anônimas
Funções auto invocáveis
• São funções que ao serem criadas já executam
• Mantem as suas variáveis com acesso apenas
interno, isso inclui funções internas.
• Para disponibilizar algum valor pode-se utilizar
o return desta função
Funções auto invocáveis
Closures
- Funções que possuem funções filhas que tem
acesso as variáveis do escopo da função pai
- Você pode salvar algum dado dentro de uma
função que é apenas acessível à função de
retorno , isto é, a função retornada mantém seu
ambiente de execução.
- Estão presentes em qualquer linguagem
funcional.
Clousures
Funções de primeira classe
- Funções mais simples que podem ser
representadas apenas com números.
- São atribuídas a uma variável
- Não e não recebem parâmetros complexos
Funções de primeira classe
Funções de alta ordem
- Funções mais complexas onde pode haver
uma ou mais funções internas.
- Podem ter escopo compartilhado.
- Recebem funções e retornam funções
Funções de alta ordem
Funções puras
Funções puras
- Funções onde dado um ou mais parâmetros de
entrada a será a mesma para toas as vezes que
estes parâmetros forem recebidos.
- Não dependem de variáveis externas, recebem
dados e retornam dados.
- Não causa nem um tipo de efeito colateral
Funções puras
Funções puras
Algumas ferramentas
Callbacks
Map
Filter
Reduce
ForEach
Algumas ferramentas
• O JavaScript desde sua versão 5.1 de 2011,
ECMA-262 passou a implementar, map, filter,
reduce e forEach como protótipos de array
Callbacks
• São funções passadas como parâmetro, para
que a função que recebeu o call-back a use
• Quem nunca usou uma chamada de Ajax da
jQuery ?
Callback
Map
- Itera um Array executando uma função de call-
back sobre cada item do Array, retornando uma
lista nova, normalmente modificada.
- A função map() recebe dois parâmetros , onde
primeiro parâmetro é uma função de call-back.
- E o segundo é opcional, é o valor a ser utilizado
como o this no momento da execução da função
callback.
Map
- O segundo parâmetro é utilizado para
especificar o valor para o escopo da função.
- O mais importante são os parâmetros
passados para a função de call-back, o
elemento do Array em si, o índice do Array, e
todo o Array (contexto)
Map
Filter
- Os parâmetros da função filter são exatamente
os mesmos da função .map().
- E como o nome sugere ela filtra alguma coisa
em um array.
- O filtro é criado a partir da logica da função de
call-back passada como parâmetro.
Filter
Reduce
- Itera um Array da mesma maneira que o map,
mas retorna a soma dos resultados da função
de call-back recebida.
- Assim como map, reduce recebe dois
argumentos. A função de call-back e o
argumento opcional para o this.
Reduce
- O primeiro é novamente a função de callback,
que será chamada para cada elemento no
Array.
- O segundo parâmetro é o initialValue que será
utilizado para somar ao próximo valor. Caso
não seja informado o primeiro valor do array é
o initialValue
Reduce
ForEach
• É uma versão não pura do .map(), que como
este recebe uma função de call-back como
parâmetro e para esta passa o item corrente,
índice e uma referencia ao próprio array.
• Mas diferentemente do map, o forEach não
tem um retorno.
ForEach
• Funciona basicamente como um for
Menos importante, mas mesmo assim
importantes
• Concat
• Reverse
• Sort
• Everey
• Some
• Flat
Manipulando funções
apply & call
• Os métodos call e apply são muito
semelhantes, ambos chamam uma função.
• Diferenciam-se pelos parâmetros recebidos
• Por padrão possuem uma variável interna
chamada arguments que recebe os
parâmetros passados além do this.
apply & call
apply & call
Biding
• É uma função que como o call, recebe this
como primeiro parâmetro e uma sequencia de
parâmetros.
• A grande diferença é que o bind retorna uma
nova função e não o resultado da chamada
como call e apply
Biding
Biding
Fábrica de funções
• São clousures que ajudam a organiza o
processo de funções que criam outras
funções.
Fábrica de funções
Partial application
• Partial application é o processo de vincular
um ou mais valores a um ou mais parâmetros
de uma função que retorna outra função que
irá aceitar os valores que não foram
vinculados ainda.
• Uma maneira bonita de criar funções que
recebem parâmetros opcionais
Partial application
Partial application
Partial application
Currying
- Em linhas gerais currying é o processo de
transformar uma função com muitos
argumentos em uma ou mais funções menores
e mais simples.
- Não afeta a função simplificada
Currying
Exemplos
/Deivis/Functional-Programming
Perguntas ?
Obrigado

Programacao funcional

  • 1.
    Programação funcional E umpouco de JavaScript
  • 2.
  • 3.
    “Programação funcional, assimcomo a orientação a objetos, é uma forma de se pensar em como resolver problemas”
  • 4.
  • 5.
    E funcional funciona? • A programação funcional ficou por anos fechada ao meio acadêmico devido a complexidade • Mas a cada dia isso vem mudando mais, as linguagens funcionais como Erlang, Clojure, Haskel, F# entre outras veem sendo cada vez mais utilizadas • Pode ser utilizada em linguagens multi-paradigma como Scala e JavaScript.
  • 6.
    Por que funcional? • Por que isso agora ? Se já convivo tanto com a orientação a objetos no JavaScript • O JavaScript não é nativamente orientado a objetos e nem puramente funcional
  • 7.
    Pedras no caminho •A programação funcional vai parecer uma loucura no começo pois estamos em nossa maioria acostumados a trabalhar com a orientação a objetos. • Para se criar bons sistemas utilizando JavaScript sobre o paradigma funcional é necessária uma bela curva de aprendizado.
  • 8.
    Um pouco dehistória
  • 9.
    O que fazuma linguagem ser funcional? Funções == objeto Imutabilidade Recursividade Lambda Independência de estado
  • 10.
    O que fazuma linguagem ser funcional? • Função é a menor parte de um programa • Na programação funcional nos preocupamos em dizer a maquina o que queremos fazer e não como iremos fazer.
  • 11.
    O que fazuma linguagem ser funcional? • A execução das expressões é controlada por condições e recursividade e não iterações diretas como ocorre nos paradigmas imperativos. • Variáveis e estados imutáveis.
  • 12.
    Sobre o paradigma •Funções não dependem do estado do sistema. • Lambda: de maneira simples, é o conceito de funções recebendo e retornando funções ou resultados das mesmas, conceito oriundo do cálculo Lambda do matemático Alonzo Church.
  • 13.
    Vantagens Modularidade Menos sujeito aefeitos colaterais Menor dependência entre módulos
  • 14.
  • 15.
    O JavaScript éfuncional ? • Em parte, pois sua construção permite a utilização tanto de programação funcional quanto de orientação a objetos.
  • 16.
  • 17.
    Funções anônimas • Sãosimplesmente funções que não tem um nome definido. • Sua utilização é bem comum quando temos apenas uma chamada a esta determinada função ou quando a retornamos como parâmetro.
  • 18.
  • 19.
    Funções auto invocáveis •São funções que ao serem criadas já executam • Mantem as suas variáveis com acesso apenas interno, isso inclui funções internas. • Para disponibilizar algum valor pode-se utilizar o return desta função
  • 20.
  • 21.
    Closures - Funções quepossuem funções filhas que tem acesso as variáveis do escopo da função pai - Você pode salvar algum dado dentro de uma função que é apenas acessível à função de retorno , isto é, a função retornada mantém seu ambiente de execução. - Estão presentes em qualquer linguagem funcional.
  • 22.
  • 23.
    Funções de primeiraclasse - Funções mais simples que podem ser representadas apenas com números. - São atribuídas a uma variável - Não e não recebem parâmetros complexos
  • 24.
  • 25.
    Funções de altaordem - Funções mais complexas onde pode haver uma ou mais funções internas. - Podem ter escopo compartilhado. - Recebem funções e retornam funções
  • 26.
  • 27.
  • 28.
    Funções puras - Funçõesonde dado um ou mais parâmetros de entrada a será a mesma para toas as vezes que estes parâmetros forem recebidos. - Não dependem de variáveis externas, recebem dados e retornam dados. - Não causa nem um tipo de efeito colateral
  • 29.
  • 30.
  • 31.
  • 32.
    Algumas ferramentas • OJavaScript desde sua versão 5.1 de 2011, ECMA-262 passou a implementar, map, filter, reduce e forEach como protótipos de array
  • 33.
    Callbacks • São funçõespassadas como parâmetro, para que a função que recebeu o call-back a use • Quem nunca usou uma chamada de Ajax da jQuery ?
  • 34.
  • 35.
    Map - Itera umArray executando uma função de call- back sobre cada item do Array, retornando uma lista nova, normalmente modificada. - A função map() recebe dois parâmetros , onde primeiro parâmetro é uma função de call-back. - E o segundo é opcional, é o valor a ser utilizado como o this no momento da execução da função callback.
  • 36.
    Map - O segundoparâmetro é utilizado para especificar o valor para o escopo da função. - O mais importante são os parâmetros passados para a função de call-back, o elemento do Array em si, o índice do Array, e todo o Array (contexto)
  • 37.
  • 38.
    Filter - Os parâmetrosda função filter são exatamente os mesmos da função .map(). - E como o nome sugere ela filtra alguma coisa em um array. - O filtro é criado a partir da logica da função de call-back passada como parâmetro.
  • 39.
  • 40.
    Reduce - Itera umArray da mesma maneira que o map, mas retorna a soma dos resultados da função de call-back recebida. - Assim como map, reduce recebe dois argumentos. A função de call-back e o argumento opcional para o this.
  • 41.
    Reduce - O primeiroé novamente a função de callback, que será chamada para cada elemento no Array. - O segundo parâmetro é o initialValue que será utilizado para somar ao próximo valor. Caso não seja informado o primeiro valor do array é o initialValue
  • 42.
  • 43.
    ForEach • É umaversão não pura do .map(), que como este recebe uma função de call-back como parâmetro e para esta passa o item corrente, índice e uma referencia ao próprio array. • Mas diferentemente do map, o forEach não tem um retorno.
  • 44.
  • 45.
    Menos importante, masmesmo assim importantes • Concat • Reverse • Sort • Everey • Some • Flat
  • 46.
  • 47.
    apply & call •Os métodos call e apply são muito semelhantes, ambos chamam uma função. • Diferenciam-se pelos parâmetros recebidos • Por padrão possuem uma variável interna chamada arguments que recebe os parâmetros passados além do this.
  • 48.
  • 49.
  • 50.
    Biding • É umafunção que como o call, recebe this como primeiro parâmetro e uma sequencia de parâmetros. • A grande diferença é que o bind retorna uma nova função e não o resultado da chamada como call e apply
  • 51.
  • 52.
  • 53.
    Fábrica de funções •São clousures que ajudam a organiza o processo de funções que criam outras funções.
  • 54.
  • 55.
    Partial application • Partialapplication é o processo de vincular um ou mais valores a um ou mais parâmetros de uma função que retorna outra função que irá aceitar os valores que não foram vinculados ainda. • Uma maneira bonita de criar funções que recebem parâmetros opcionais
  • 56.
  • 57.
  • 58.
  • 59.
    Currying - Em linhasgerais currying é o processo de transformar uma função com muitos argumentos em uma ou mais funções menores e mais simples. - Não afeta a função simplificada
  • 60.
  • 61.
  • 62.

Notas do Editor

  • #4  Um paradigma de programação que trata a computação como uma avaliação de funções matemáticas e que evita estados ou dados mutáveis
  • #5  Evolução brutal do hardware, os computadores agora tem multiprocessadores sofisticados, multi-core com terabytes de memória. A internet e a computação na nuvem - Necessidade de reutilização do códgio
  • #6 Chat do facebook feito em Erlang
  • #7 ECMAScript does not contain proper classes such as those in C++, Smalltalk, or Java, but rather, supports constructors which create objects. In a class-based object-oriented language, in general, state is carried by instances, methods are carried by classes, and inheritance is only of structure and behavior. In ECMAScript, the state and methods are carried by objects, and structure, behavior and state are all inherited
  • #9 A base do que hoje é a programação funcional foi criada paralelamente por Alan Turing e Alonzo Church, na década de 1930. A primeira linguagem de programação funcional criada para computadores foi LISP, desenvolvida por John McCarthy no Instituto de Tecnologia de Massachusetts (MIT) no fim dos anos 1950. Mas por um bom tempo este paradigma ficou fadado a ser apenas mais um tema acadêmico, por que ? De maneira rápida, sucinta e meio criacionista alguns fatos que sobrepujaram as linguagens funcionais. Computadores lentos e com pouca capacidade A linguagem Assembly deu origem a C, C para C++ e OO, e C++ e OO levando para Java – todas as imperativas e rápidas para os padrões de hardware da época O que levou o LISP e outras linguagens funcionais a serem deixadas de lado por sua lentidão. Cálculo labda !!!
  • #10 Função é a menor parte de um programa Na programação funcional nos preocupamos em dizer a maquina o que queremos fazer e não como iremos fazer. A execução das expressões é controlada por condições e recursividade e não iterações diretas como ocorre nos paradigmas imperativos. Variáveis e estados imutáveis. Funções não dependem do estado do sistema. Lambda: funções recebendo e retornando funções ou resultados das mesmas
  • #13 Cálculo Lambda
  • #14 Melhor modularidade Menos sujeito a efeitos colaterais Mais facilidade em resolver problemas de programação concorrente, devido a imutabilidade
  • #15 Melhor modularidade Menos sujeito a efeitos colaterais Mais facilidade em resolver problemas de programação concorrente, devido a imutabilidade - Você possui um controle a nível matemático do seu código, uma vez q este implemente os princípios da funcional.
  • #16 De acordo com a ECMA JS não é puramente orientado a objeto mas pode implementar OO por meio do padrão de protótipos. JS não contem classes como linguagens OO e nem tipagem forte No JS o estado e os métodos são transportados por objetos, estruturas, funções e o estado pode ser herdado ou passado a diante
  • #17 Self invoking Clousures High order Pure Anonymus Method chains Recursion Lazy evaluation
  • #23 Funções que possuem funções filhas que tem acesso as variáveis do escopo da função pai Você pode salvar algum dado dentro de uma função que é apenas acessível à função de retorno , isto é, a função retornada mantém seu ambiente de execução. Call-backs podem ser considerados clousures.
  • #25 Funções mais simples que podem ser representadas apenas com números. São atribuídas a uma variável Não e não recebem parâmetros complexos.
  • #27 Funções mais complexas onde pode haver uma ou mais funções internas. Podem ter escopo compartilhado. Recebem funções e retornam funções
  • #28 Funções onde dado um ou mais parâmetros de entrada a será a mesma para toas as vezes que estes parâmetros forem recebidos. Não dependem de variáveis externas, recebem dados e retornam dados. Não causa nem um tipo de efeito colateral 
  • #32 O js desde sua versão 5 de 2011, ECMA-262 passou a implementar, map, reduce e filter como protótipos de array Map. Itera um Array executando uma função de call-back sobre cada item do Array, retornando uma lista nova, normalmente modificada. A função map() recebe dois parâmetros , onde primeiro parâmetro é uma função de call-back. O segundo parâmetro é utilizado para especificar o valor para o escopo da função. O mais importante são os parâmetros passados para a função de call-back, o elemento do Array em si, o índice do Array, e todo o Array (contexto) . Filter Os parâmetros da função filter são exatamente os mesmos da função map(). E como o nome sugere ela filtra alguma coisa em um array. O filtro é criado a partir da logica da função de call-back passada como parâmetro. Reduce. Itera um Array da mesma maneira que o map, mas retorna a soma dos resultados da função de call-back recebida. Assim como map, reduce recebe dois argumentos. O primeiro é novamente a função de callback, que será chamada para cada elemento no Array. O segundo parâmetro é o initialValue que será utilizado para somar ao próximo valor. Caso não seja informado o primeiro valor do array é o initialValue.
  • #38 Referência: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
  • #40 Referência: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
  • #43 Referência: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
  • #46 - Zip
  • #49 Recebe um valor para this e muitos argumentos
  • #50 O applay também recebe um valor para this, mas como segundo parâmetro recebe um array.
  • #55 - São super clousures que ajuam a organiza o processo de funções que criam outras funções - aqui chammos a bindSegundoArgumento para criar a nova função quando executamos quadradoDe, não estamos executando bindSegundoArgumento mas sim o resultado da função que passamos como parâmetro recebendo o valor passado para bindSegundoArgumento e o valor passado a quadradoDe como parâmetros
  • #61 Em linhas gerais currying é uma função com argumentos simples que simplifica outra função mais complexa. Não afeta a função simplificada
  • #72 Não esquecer: Teoria das categorias functors Monads Maybes Promises Lenses JQ is a Monad Herança de funções Mixins Padrão de estratégia