SlideShare uma empresa Scribd logo
1 de 16
Baixar para ler offline
Padrões de Projeto em Linguagens 
Funcionais 
Italos Estilon e Layna Castro
O que é Programação Funcional? 
Programação funcional é 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. Ela enfatiza a aplicação de 
funções, em contraste da programação imperativa, que enfatiza 
mudanças no estado do programa .
Por que Programação Funcional? 
● Facilita a escrita de programas concorrentes 
● A maioria dos programas são apenas problemas de 
gerenciamento de dados. 
● Programação Funcional é mais modular. 
● Mais velocidade. 
● A Programação Funcional é o retorno à simplicidade.
O que é Padrão de Projeto? 
“Uma solução nomeada e catalogada para um 
problema comum”
Padrões de Projeto em Programação Funcional 
● Alguns acreditam que a Programação Funcional torna os 
padrões de projeto obsoletos. 
● Essa visão confunde o conceito de padrão com alguns padrões 
de exemplo que podem ser desnecessários em Programação 
Funcional. 
● A Programação Funcional também possui seu próprio conjunto 
de padrões.
Padrões de Projeto em Programação Funcional 
Segundo Neal Ford, os padrões de projeto na Programação 
Funcional se manifestam de uma dessas três maneiras: 
● O padrão é absorvido pela linguagem. 
● A solução padrão ainda existe no paradigma funcional, mas os 
detalhes de implementação diferem. 
● A solução é implementada usando recursos que outras 
linguagens ou paradigmas não tem.
Fábricas e Currying 
● Currying transforma uma função multiargument de modo que 
ele pode ser chamado como uma cadeia de funções de 
argumentos simples. 
● No contexto de padrões de projeto, currying atua como uma 
fábrica de funções. 
● Graças às funções de primeira classe é fácil criar funções que 
retornam outras funções baseado em algum critério, o que é a 
essência da fábrica.
Exemplo de Fábrica 
somador::Num a => a -> a-> a 
somador x y = x + y 
incrementador::Integer->Integer 
incrementador = somador 1 
● A função “incrementador” foi declarada como uma avaliação 
parcial da função “somador”. Note que poderia ter sido 
utilizada uma função anônima.
Exemplo de Fábrica 
● Outro exemplo de fábrica: 
filtro::[a]->(a->Bool)->[a] 
filtro [] _ = [] 
filtro (a:xs) f 
| f a = a:(filtro xs f) 
| otherwise = filtro xs f 
dividePor::Integral a => a->a->Bool 
dividePor x y 
|y `mod` x == 0 = True 
|otherwise = False 
multiposDeCinco = filtro [0..] (dividePor 5)
Exemplo de Fábrica 
● A função “filtro” filtra uma lista de elementos com base em 
uma função que recebe por parâmetro. 
● A função que é passada é uma avaliação parcial da função 
“dividePor”, que retorna “True” se o primeiro parâmetro divide 
o segundo. 
● A função que é passada para “filtro” é fabricada pelo Currying.
Template Method 
● Outro padrão simplificado por funções de primeira classe. 
● A função “map” recebe uma função e uma lista de elementos e aplica a função a cada 
elemento da lista criando uma nova lista. 
● “map” precisa apenas que a função passada seja do tipo “(a - > b)”. 
● A operação específica de mapeamento é personalizada pelos argumentos da função. 
map::(a->b)->[a]->[b] 
map _ [] = [] 
map f (x:xs) = (f x):(map f xs) 
quadradosPerfeitos = map ( x -> x*x) [0..]
Adapter 
● Converte uma interface em uma outra esperada pelos clientes. 
● Em Scala, pode ser implementado com o conceito de classe implícita. 
● Quando o tipo esperado é “Log”, mas uma instância de “Logger” é usada, o 
compilador Scala irá automaticamente envolver essa instância na classe adaptador. 
trait Log { 
def warning(message: String) 
def error(message: String) 
} 
final class Logger { 
def log(level: Level, message: String) { /* ... */ } 
} 
implicit class LoggerToLogAdapter(logger: Logger) extends Log { 
def warning(message: String) { logger.log(WARNING, message) } 
def error(message: String) { logger.log(ERROR, message) } 
} 
val log: Log = new Logger()
Memoization 
● Memoização é uma técnica para armazenar valores de uma 
função em vez de refazer os cálculos cada vez que a função é 
chamada. 
memoized_fib :: Int -> Integer 
memoized_fib = (map fib [0 ..] !!) 
where fib 0 = 0 
fib 1 = 1 
fib n = memoized_fib (n-2) + memoized_fib(n-1)
Correspondência de Padrões 
● Correspondência de padrões consiste na pesquisa por padrões 
em determinados dados e, caso tenha sucesso, fazer algo com o 
ele. 
● Abordagem funcional para o padrão de projeto Visitor. 
delete::(Eq a) => a -> [a] -> [a] 
delete a [] = [] 
delete a [x] = if a == x then [] else [x] 
delete a (x:xs) = [] ++ if (x == a) then xs else x:(delete a xs)
Fold 
● Refere-se a uma família de funções de ordem superior que 
analisam a estrutura de dados recursiva e recombinam através 
do uso de uma determinada operação, combinando os 
resultados de forma recursiva processando suas partes 
constituintes, construindo-se um valor de retorno. 
foldL::(a -> b -> a) -> a -> [b] -> a 
foldL _ a [] = a 
foldL f a (x:xs) = foldL f (f a x) xs
Referências 
● WAMPLER, Dean. programação funcional para desenvolvedores Java. São Paulo, SP: 
Novatec, 2012. 112 p. ISBN 9788575223161 (broch.). 
● http://www.ibm.com/developerworks/library/j-ft10/ 
● http://http://en.wikipedia.org/wiki/Fold_(higher-order_function) 
● http://haskell.tailorfontela.com.br/ 
● http://www.ibm.com/developerworks/java/library/j-ft11/index.html 
● http://www.ibm.com/developerworks/java/library/j-ft12/index.html 
● https://pavelfatin.com/design-patterns-in-scala/#adapter 
● https://www.haskell.org/haskellwiki/Memoization

Mais conteúdo relacionado

Destaque (19)

Grade 12 Results
Grade 12 ResultsGrade 12 Results
Grade 12 Results
 
Volcom Stone Award
Volcom Stone AwardVolcom Stone Award
Volcom Stone Award
 
Votado Co..
Votado Co..Votado Co..
Votado Co..
 
Nombre del presidente de colombia
Nombre del presidente de colombiaNombre del presidente de colombia
Nombre del presidente de colombia
 
Preguntas de areas fundamentales
Preguntas de areas fundamentalesPreguntas de areas fundamentales
Preguntas de areas fundamentales
 
งานที่ 1 8
งานที่ 1 8งานที่ 1 8
งานที่ 1 8
 
Fatih akıncılar 8
Fatih akıncılar  8Fatih akıncılar  8
Fatih akıncılar 8
 
PhD DMC
PhD DMCPhD DMC
PhD DMC
 
Retrieving freedom retrieving freedom-98
Retrieving freedom retrieving freedom-98Retrieving freedom retrieving freedom-98
Retrieving freedom retrieving freedom-98
 
I.C.D.L
I.C.D.LI.C.D.L
I.C.D.L
 
Almanaque delas.compressed
Almanaque delas.compressedAlmanaque delas.compressed
Almanaque delas.compressed
 
Clc80
Clc80Clc80
Clc80
 
dealing
dealingdealing
dealing
 
Professional Reference List
Professional Reference ListProfessional Reference List
Professional Reference List
 
Abcd
AbcdAbcd
Abcd
 
Energia
EnergiaEnergia
Energia
 
รายชื่อนักเรียน ร.ร.ป่าไม้อุทิศ ๙ ปีการศึกษา 2556
รายชื่อนักเรียน ร.ร.ป่าไม้อุทิศ ๙ ปีการศึกษา 2556รายชื่อนักเรียน ร.ร.ป่าไม้อุทิศ ๙ ปีการศึกษา 2556
รายชื่อนักเรียน ร.ร.ป่าไม้อุทิศ ๙ ปีการศึกษา 2556
 
Cara flashing axioo
Cara flashing axiooCara flashing axioo
Cara flashing axioo
 
Apresentação FSP Brasil
Apresentação FSP BrasilApresentação FSP Brasil
Apresentação FSP Brasil
 

Semelhante a Padrões de projeto em linguagens funcionais

Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java 8 - Expressões Lambda e Stream API - DevCamp 2014Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java 8 - Expressões Lambda e Stream API - DevCamp 2014Danival Calegari
 
Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Matheus Pereira
 
TDC 2014 - Java 8: Expressões Lambda e API de Stream
TDC 2014 - Java 8: Expressões Lambda e API de StreamTDC 2014 - Java 8: Expressões Lambda e API de Stream
TDC 2014 - Java 8: Expressões Lambda e API de StreamDanival Calegari
 
Aula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptxAula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptxItamarGoncalves2
 
Programacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshareProgramacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshareMarcio Junior Vieira
 
Programação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicProgramação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicMarcio Junior Vieira
 
Programação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicProgramação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicAmbiente Livre
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoArthur Xavier
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturadadiogoa21
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaDeivid Martins
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Algoritmos e Estruturas de Dados, edição de 2013/2014
Algoritmos e Estruturas de Dados, edição de 2013/2014Algoritmos e Estruturas de Dados, edição de 2013/2014
Algoritmos e Estruturas de Dados, edição de 2013/2014Pedro Guerreiro
 

Semelhante a Padrões de projeto em linguagens funcionais (20)

Funções em C
Funções em CFunções em C
Funções em C
 
Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java 8 - Expressões Lambda e Stream API - DevCamp 2014Java 8 - Expressões Lambda e Stream API - DevCamp 2014
Java 8 - Expressões Lambda e Stream API - DevCamp 2014
 
Linguagem C - Funções
Linguagem C - FunçõesLinguagem C - Funções
Linguagem C - Funções
 
01-Paradigmas.pdf
01-Paradigmas.pdf01-Paradigmas.pdf
01-Paradigmas.pdf
 
Scheme
SchemeScheme
Scheme
 
Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...
 
TDC 2014 - Java 8: Expressões Lambda e API de Stream
TDC 2014 - Java 8: Expressões Lambda e API de StreamTDC 2014 - Java 8: Expressões Lambda e API de Stream
TDC 2014 - Java 8: Expressões Lambda e API de Stream
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Aula05-JavaScript
Aula05-JavaScriptAula05-JavaScript
Aula05-JavaScript
 
Aula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptxAula 8 - Modularização e Funções.pptx
Aula 8 - Modularização e Funções.pptx
 
Programacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshareProgramacao de macros_com_libre_office_basic_slideshare
Programacao de macros_com_libre_office_basic_slideshare
 
Programação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicProgramação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice Basic
 
Programação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice BasicProgramação de Macros com LibreOffice Basic
Programação de Macros com LibreOffice Basic
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introdução
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e Distribuída
 
11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Algoritmos e Estruturas de Dados, edição de 2013/2014
Algoritmos e Estruturas de Dados, edição de 2013/2014Algoritmos e Estruturas de Dados, edição de 2013/2014
Algoritmos e Estruturas de Dados, edição de 2013/2014
 
Programação Orientada por Objectos - Aula 1
Programação Orientada por Objectos - Aula 1Programação Orientada por Objectos - Aula 1
Programação Orientada por Objectos - Aula 1
 

Último

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 

Último (6)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 

Padrões de projeto em linguagens funcionais

  • 1. Padrões de Projeto em Linguagens Funcionais Italos Estilon e Layna Castro
  • 2. O que é Programação Funcional? Programação funcional é 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. Ela enfatiza a aplicação de funções, em contraste da programação imperativa, que enfatiza mudanças no estado do programa .
  • 3. Por que Programação Funcional? ● Facilita a escrita de programas concorrentes ● A maioria dos programas são apenas problemas de gerenciamento de dados. ● Programação Funcional é mais modular. ● Mais velocidade. ● A Programação Funcional é o retorno à simplicidade.
  • 4. O que é Padrão de Projeto? “Uma solução nomeada e catalogada para um problema comum”
  • 5. Padrões de Projeto em Programação Funcional ● Alguns acreditam que a Programação Funcional torna os padrões de projeto obsoletos. ● Essa visão confunde o conceito de padrão com alguns padrões de exemplo que podem ser desnecessários em Programação Funcional. ● A Programação Funcional também possui seu próprio conjunto de padrões.
  • 6. Padrões de Projeto em Programação Funcional Segundo Neal Ford, os padrões de projeto na Programação Funcional se manifestam de uma dessas três maneiras: ● O padrão é absorvido pela linguagem. ● A solução padrão ainda existe no paradigma funcional, mas os detalhes de implementação diferem. ● A solução é implementada usando recursos que outras linguagens ou paradigmas não tem.
  • 7. Fábricas e Currying ● Currying transforma uma função multiargument de modo que ele pode ser chamado como uma cadeia de funções de argumentos simples. ● No contexto de padrões de projeto, currying atua como uma fábrica de funções. ● Graças às funções de primeira classe é fácil criar funções que retornam outras funções baseado em algum critério, o que é a essência da fábrica.
  • 8. Exemplo de Fábrica somador::Num a => a -> a-> a somador x y = x + y incrementador::Integer->Integer incrementador = somador 1 ● A função “incrementador” foi declarada como uma avaliação parcial da função “somador”. Note que poderia ter sido utilizada uma função anônima.
  • 9. Exemplo de Fábrica ● Outro exemplo de fábrica: filtro::[a]->(a->Bool)->[a] filtro [] _ = [] filtro (a:xs) f | f a = a:(filtro xs f) | otherwise = filtro xs f dividePor::Integral a => a->a->Bool dividePor x y |y `mod` x == 0 = True |otherwise = False multiposDeCinco = filtro [0..] (dividePor 5)
  • 10. Exemplo de Fábrica ● A função “filtro” filtra uma lista de elementos com base em uma função que recebe por parâmetro. ● A função que é passada é uma avaliação parcial da função “dividePor”, que retorna “True” se o primeiro parâmetro divide o segundo. ● A função que é passada para “filtro” é fabricada pelo Currying.
  • 11. Template Method ● Outro padrão simplificado por funções de primeira classe. ● A função “map” recebe uma função e uma lista de elementos e aplica a função a cada elemento da lista criando uma nova lista. ● “map” precisa apenas que a função passada seja do tipo “(a - > b)”. ● A operação específica de mapeamento é personalizada pelos argumentos da função. map::(a->b)->[a]->[b] map _ [] = [] map f (x:xs) = (f x):(map f xs) quadradosPerfeitos = map ( x -> x*x) [0..]
  • 12. Adapter ● Converte uma interface em uma outra esperada pelos clientes. ● Em Scala, pode ser implementado com o conceito de classe implícita. ● Quando o tipo esperado é “Log”, mas uma instância de “Logger” é usada, o compilador Scala irá automaticamente envolver essa instância na classe adaptador. trait Log { def warning(message: String) def error(message: String) } final class Logger { def log(level: Level, message: String) { /* ... */ } } implicit class LoggerToLogAdapter(logger: Logger) extends Log { def warning(message: String) { logger.log(WARNING, message) } def error(message: String) { logger.log(ERROR, message) } } val log: Log = new Logger()
  • 13. Memoization ● Memoização é uma técnica para armazenar valores de uma função em vez de refazer os cálculos cada vez que a função é chamada. memoized_fib :: Int -> Integer memoized_fib = (map fib [0 ..] !!) where fib 0 = 0 fib 1 = 1 fib n = memoized_fib (n-2) + memoized_fib(n-1)
  • 14. Correspondência de Padrões ● Correspondência de padrões consiste na pesquisa por padrões em determinados dados e, caso tenha sucesso, fazer algo com o ele. ● Abordagem funcional para o padrão de projeto Visitor. delete::(Eq a) => a -> [a] -> [a] delete a [] = [] delete a [x] = if a == x then [] else [x] delete a (x:xs) = [] ++ if (x == a) then xs else x:(delete a xs)
  • 15. Fold ● Refere-se a uma família de funções de ordem superior que analisam a estrutura de dados recursiva e recombinam através do uso de uma determinada operação, combinando os resultados de forma recursiva processando suas partes constituintes, construindo-se um valor de retorno. foldL::(a -> b -> a) -> a -> [b] -> a foldL _ a [] = a foldL f a (x:xs) = foldL f (f a x) xs
  • 16. Referências ● WAMPLER, Dean. programação funcional para desenvolvedores Java. São Paulo, SP: Novatec, 2012. 112 p. ISBN 9788575223161 (broch.). ● http://www.ibm.com/developerworks/library/j-ft10/ ● http://http://en.wikipedia.org/wiki/Fold_(higher-order_function) ● http://haskell.tailorfontela.com.br/ ● http://www.ibm.com/developerworks/java/library/j-ft11/index.html ● http://www.ibm.com/developerworks/java/library/j-ft12/index.html ● https://pavelfatin.com/design-patterns-in-scala/#adapter ● https://www.haskell.org/haskellwiki/Memoization