PROGRAMAÇÃO FUNCIONAL Agenda 01 02 03 04 Paradigma Funcional Conceitos Fundamentais Expressões Lambda Aprofundamento Paradigma Funcional Agenda Style Paradigma Funcional ❏ É um padrão ao qual as linguagens de programação podem seguir; ❏ Indica como se deve proceder para conseguir resolver problemas; ❏ As linguagens podem ser criadas para suportar um determinado paradigma; Porém, uma linguagem pode suportar vários paradigmas; O que é um paradigma de programação? Agenda Style Paradigma Funcional ❏ Programação Imperativa; ❏ Programação Estruturada; ❏ Programação Orientada a Objetos; ❏ Programação Funcional; Os paradigmas mais comuns Agenda Style Paradigma Funcional ❏ Apenas descreve o QUE o programa faz, sem informar COMO deve ser realizado; ❏ Não há a ideia de estado do programa; ❏ Em decorrência disso, não há efeitos colaterais; Linguagens funcionais são declarativas Agenda Style Paradigma Funcional ❏ Em linguagem declarativa: Um cafezinho, por favor! ❏ Em linguagem imperativa: Pegue a garrafa térmica! Tire a tampa! Despeje uma dose de café em uma xícara limpa! Feche a garrafa! Traga a xícara para mim! Diferença entre Declarativo e Imperativo Agenda Style Paradigma Funcional ❏ Expressão constituída pela aplicação de uma função a seus argumentos; o resultado é obtido computando-se a aplicação da função aos argumentos (FIGUEIREDO) Definição Agenda Style Paradigma Funcional ❏ Programas mais concisos e simples; ❏ Facilita a realização de testes unitários; ❏ Facilita o paralelismo; ❏ Alto nível de abstração para programação; Pontos Positivos Agenda Style Paradigma Funcional ❏ Funções Puras ❏ Efeito Colateral ❏ Imutabilidade ❏ Estado Compartilhado ❏ Composição de Funções Conceitos Fundamentais Agenda Style Conceitos Fundamentais ❏ Função que retorna exatamente o mesmo valor de saída para um mesmo valor de entrada; ❏ É totalmente determinística ❏ Não gera efeitos colaterais e nem depende de estados que possam ser afetados por efeitos colaterais Funções Puras Agenda Style Conceitos Fundamentais ❏ No paradigma funcional um efeito colateral é uma mudança de um estado que esteja fora do escopo da função executada; ❏ É controlado com o uso de estados imutáveis ao invés de variáveis; ❏ Em caso I/O é difícil de ser evitado. Ex.: alterações no BD; Gravações de arquivos; Comunicações com APIs; Nesses casos os efeitos colaterais devem ser isolados em funções impuras; Efeito Colateral Agenda Style Conceitos Fundamentais ❏ Uma variável declarada com um valor vai manter o mesmo valor ao longo de toda a execução do programa, isto é, ela será uma constante; ❏ Cada linguagem implementa de forma diferente esse tipo de valor. Linguagens puramente funcionais podem nem mesmo ter o conceito de variável; Imutabilidade Agenda Style Conceitos Fundamentais ❏ É uma variável que pode ser acessada em mais de um ponto da aplicação; ❏ Tal variável pode ser transmitida entre escopos ou estar em um escopo compartilhado, algo semelhante a uma variável global; ❏ Seu uso não é recomendado no Paradigma Funcional; Estado Compartilhado Agenda Style Conceitos Fundamentais ❏ Uma nova função é criada pela concatenação de outras; ❏ Com isso são evitados os dados mutáveis, o compartilhamento de estado e os efeitos colaterais Composição de Funções Expressões Lambda Agenda Style Expressões Lambda ❏ É uma função sem declaração, isto é, não precisa ter nome, tipo de retorno ou modificador de acesso. ❏ É formada por uma sequência de padrões representando os argumentos da função, e um corpo que especifica como o resultado pode ser calculado usando os argumentos. ❏ Ex: n -> n + 1 () -> { System.out.println(“Hello World”) } Expressões Lambda Agenda Style Expressões Lambda ❏ Pode ter zero ou mais parâmetros; ❏ Em Java os tipos podem ser declarados ou não, nesse caso serão inferidos pela JVM; ❏ Pode ter zero ou mais comandos, em Java, caso tenha vários comando, precisa usar as chaves para delimitar o bloco; ❏ Revendo o exemplo da criação de Thread: Runnable r = () -> System.out.println("Thread lambda!"); new Thread(r).start(); Expressões Lambda Aprofundamento Agenda Style Aprofundamento ❏ As funções podem ser enfileiradas em um pipeline (tubulação) ❏ A saída de uma função é a entrada da próxima Pipeline de Funções Agenda Style Aprofundamento ❏ A linguagem funcional é baseada nas funções matemáticas; ❏ Dadas duas funções chamadas f(x) e g(x), um pipeline seria o mesmo que: ❏ SE y = f(x) e z = g(y) ENTÃO z = g( f( x) ) ❏ Esse formato poderia ser usado nas linguagens de programação, porém fica pouco legível, por isso são usadas mônadas. A matemática por trás Agenda Style Aprofundamento ❏ Mônada é um tipo parametrizado que deve possuir pelo menos duas operações principais (Ordersky, criador da linguagem Scala); ❏ unit : Põe um parâmetro dentro da mônada; Pode ser um construtor, o método “of” em Optional etc. ❏ flatMap : permite fazer o encadeamento das chamadas, recebendo uma expressão Lambda como parâmetro Mônadas Agenda Style Referências ❏ Expressão Lambda : http://www.decom.ufop.br/romildo/2014-1/bcc22 2/practices/p14-lambda.pdf ❏ Exemplos de código : https://www.devmedia.com.br/introducao-a-mon adas/33113 ❏ Programação Funcional : https://homepages.dcc.ufmg.br/~camarao/curso s/fp/Lecture01.pdf ❏ Referências