O documento discute programação funcional em JavaScript, incluindo como funções são objetos primários, a importância de imutabilidade e recursividade, e ferramentas como map, filter e reduce. Também cobre tópicos como funções puras, closures, partial application e currying.
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.
9. O que faz uma linguagem ser
funcional?
Funções == objeto
Imutabilidade
Recursividade
Lambda
Independência de estado
10. 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.
11. 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.
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.
17. 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.
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
21. 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.
23. 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
25. 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
28. 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
32. 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
33. 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 ?
35. 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.
36. 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)
38. 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.
40. 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.
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
43. 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.
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.
50. 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
55. 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
59. 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
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
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
Chat do facebook feito em Erlang
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
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 !!!
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
Cálculo Lambda
Melhor modularidade
Menos sujeito a efeitos colaterais
Mais facilidade em resolver problemas de programação concorrente, devido a imutabilidade
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.
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
Self invoking
Clousures
High order
Pure
Anonymus
Method chains
Recursion
Lazy evaluation
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.
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 mais complexas onde pode haver uma ou mais funções internas.
Podem ter escopo compartilhado.
Recebem funções e retornam funções
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
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.
O applay também recebe um valor para this, mas como segundo parâmetro recebe um array.
- 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
Em linhas gerais currying é uma função com argumentos simples que simplifica outra função mais complexa.
Não afeta a função simplificada
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