SlideShare uma empresa Scribd logo
1 de 69
Globalcode – Open4education
Trilha .NET – Programação funcional usando
C#
Gabriel Schade Cardoso
Microsoft MVP | Software Engineer | Mestre em Computação Aplicada |
Professor | Escritor
Globalcode – Open4education
Mestre em computação aplicada a IA
Microsoft MVP – Dev. Technologies
Desenvolvedor, Professor e Revisor
Autor dos livros
Gabriel Schade Cardoso
Globalcode – Open4education
Programação Funcional
Quem aqui sabe o que é isso?
Isso é o ícone da F# Foundation
F# também é .NET
Globalcode – Open4education
Problemas comuns
Quem aqui sabe o que é isso?
ArgumentNullException
DomainException
Essa nem existe na linguagem, mas eu já vi TANTO
Globalcode – Open4education
Como essas duas coisas estão
conectadas?
Programação funcional é bem diferente de
programação orientada à objetos;
Podemos aprender muito com F#;
É um paradigma diferente;
Globalcode – Open4education
Como essas duas coisas estão
conectadas?
Ao aprender um novo paradigma, você aprende uma
nova forma de ver os problemas.
Globalcode – Open4education
Vamos ao problema do null
Veja este método:
O que ele tem de errado?
Globalcode – Open4education
Vamos ao problema do null
Ele é um método mentiroso;
A assinatura dele me diz que ele irá retornar um
usuário, mas se o Id for inválido?
Globalcode – Open4education
Vamos ao problema do null
Veja este método:
O que é um User option?
Globalcode – Open4education
Vamos ao problema do null
Este é um método honesto, ele indica que talvez
ele retorne um usuário;
Ok, mas o que isso muda na nossa vida?
Globalcode – Open4education
Vamos ao problema do null
Mas isso não é só um null check obrigatório?
Quase, mas causa erro de compilação.
O erro acontece porque o tipo option é um value container, não o
valor em si.
Globalcode – Open4education
Value Containers
Já ouviram falar?
Globalcode – Open4education
Um container pode ser visto como um envelope ou uma caixa
que circunda um objeto/valor, incluindo-o em algum contexto
específico.
Lidamos com este tipo de valor o tempo todo:
List;
Task;
Nullable.
Value Containers
Globalcode – Open4education
Imagine o seguinte cenário: você possui um dado do tipo
inteiro e precisa somá-lo com o valor 3.
Value Containers
Globalcode – Open4education
E se este número estiver em um array? Mesmo que sozinho...
Value Containers
Globalcode – Open4education
Não podemos realizar a soma com o mesmo valor, isso por
conta do contexto que o cerca.
Por isso, comumente temos uma função para remover o valor
de seu contexto.
Value Containers
Globalcode – Open4education
No caso do array podemos utilizar o indexador para remover
um valor do contexto.
Value Containers
Globalcode – Open4education
Geralmente utilizamos as funções Map/Filter/Reduce ou
Select/Where/Aggregate, mas também podemos utilizar uma
comparação de padrões (pattern matching).
Podemos nos aproveitar deste conceito para criar novos
objetos e classes que armazenam valores sob um determinado
contexto.
Value Containers
Globalcode – Open4education
Option<T>
Que tal criar um Option para o C#?
1. O tipo não pode assumir o valor null;
2. Precisamos de uma maneira de extrair a informação do
contexto;
3. Não deixaremos o programador acessar a informação, caso ela
esteja no estado inválido;
Globalcode – Open4education
Globalcode – Open4education
Option
Como extrair o valor?
Globalcode – Open4education
Option<T>
Que tal criar um pattern matching?
Globalcode – Open4education
Option<T>
O usuário precisará lidar com os dois casos sempre:
Globalcode – Open4education
Option<T>
Utilize cast implícito para facilitar a criação destes valores:
Globalcode – Open4education
Option<T>
Globalcode – Open4education
Value Containers
E se precisássemos de validações mais complexas?
Existem mais value containers além do Option!
Either<TLeft, TRight>
...
Vamos refatorar uma funcionalidade que atualiza um usuário
Globalcode – Open4education
Vejam este código “inofensivo”:
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Reparem nesta estrutura de código:
Void?
Globalcode – Open4education
Atualizando um usuário
Reparem nesta estrutura de código:
Void?
Globalcode – Open4education
Atualizando um usuário
Reparem nesta estrutura de código:
Sempre Ok?
E quando as coisas derem errado?
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Como as exceções não estão sendo tratadas, acabamos
sempre retornando um erro 500.
Este HTTP code não deve ser utilizado para isso, precisamos
retornar um 400 (bad request).
Onde colocar esse tratamento?
Globalcode – Open4education
Globalcode – Open4education
Atualizando um usuário
Algo deu errado, o código não deveria ficar assim estranho.
Vamos tentar produzir esse resultado, mas sem try-catches:
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Precisamos continuar enviando o resultado para frente, mesmo
se algo deu errado, dessa forma não quebramos o fluxo de
código.
Vamos fazer mais um container, dessa vez para representar
um resultado para a continuação de uma operação.
Globalcode – Open4education
Atualizando um usuário
Globalcode – Open4education
Atualizando um usuário
Notem que as propriedades de nossa classe só possuem um
método get, ou seja, todas elas são readonly;
Precisamos de construtores!
Globalcode – Open4education
Atualizando um usuário
Em um construtor
temos apenas os
dados de sucesso, no
outro os de falha.
Globalcode – Open4education
Com nosso novo container já é possível retornar um resultado!
Vamos começar adaptando a função Update!
Criando um novo tipo
Globalcode – Open4education
Return em dois locais diferentes?
Ainda usamos try-catch?
Vamos quebrar as validações do banco em métodos separados
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
Globalcode – Open4education
Lembram do cast implícito do Option?
Vamos fazer aqui também!
Criando um novo tipo
Globalcode – Open4education
Com o cast implícito podemos simplesmente retornar os
valores;
Criando um novo tipo
Globalcode – Open4education
Com o cast implícito podemos simplesmente retornar os
valores;
Criando um novo tipo
Globalcode – Open4education
Com o cast implícito podemos simplesmente retornar os
valores;
Criando um novo tipo
Globalcode – Open4education
Agora vamos resolver os problemas do método Validate;
Criando um novo tipo
Globalcode – Open4education
Agora vamos resolver os problemas do método Validate;
Criando um novo tipo
Globalcode – Open4education
Agora vamos resolver os problemas do método Validate;
Criando um novo tipo
Globalcode – Open4education
Removendo os try-catches do controller!
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
Globalcode – Open4education
Criando um novo tipo
Globalcode – Open4education
Atualizando um usuário
A solução ainda está bem estranha!
Esses If’s não estão legais...
E se a struct de continuação oferecer uma forma de
continuarmos a expressão?
Globalcode – Open4education
Atualizando um usuário
Vamos criar os métodos Then e Catch;
Eles recebem uma função por parâmetro e retornam uma
estrutura de continuação!
Globalcode – Open4education
Atualizando um usuário
O método Catch faz a mesma coisa, mas com a comparação
inversa:
Globalcode – Open4education
Atualizando um usuário
Agora podemos utilizar estes métodos no controller!
Globalcode – Open4education
Atualizando um usuário
O Update precisa de 2 parâmetros!!
Globalcode – Open4education
Atualizando um usuário
É só usar Lambda!
Globalcode – Open4education
Atualizando um usuário
Neste ponto você já deve ter percebido que estamos sempre
atualizando o continuation, certo?
Mas como o próprio método já o retorna, podemos utilizar
uma sintaxe encadeada!
Além disso, podemos utilizar um match para finalizar e
retornar o resultado!
Globalcode – Open4education
Atualizando um usuário
Saímos daqui:
Globalcode – Open4education
Atualizando um usuário
Chegamos aqui:
Globalcode – Open4education
Atualizando um usuário
Chegamos aqui:
Globalcode – Open4education
Atualizando um usuário
Outros exemplos:
Globalcode – Open4education
Nuget  Tango  Open source
Github.com/gabrielschade/Tango
Open source
E-book gratuito em português e inglês
/gabrielschade /gabrielschade
https://gabrielschade.github.io

Mais conteúdo relacionado

Mais procurados

TDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de GuardaTDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de GuardaDouglas Siviotti
 
tdc-recife-2020-complexidade-cognitiva
tdc-recife-2020-complexidade-cognitivatdc-recife-2020-complexidade-cognitiva
tdc-recife-2020-complexidade-cognitivaDouglas Siviotti
 
Refinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoRefinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoAécio Costa
 
Page Object para Testers - The Developers Conference 2017
Page Object para Testers - The Developers Conference 2017Page Object para Testers - The Developers Conference 2017
Page Object para Testers - The Developers Conference 2017Katiana Maia
 
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboyComo melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboyLeonardo Galani
 
Como você testa seu software TDC 2017
Como você testa seu software  TDC 2017Como você testa seu software  TDC 2017
Como você testa seu software TDC 2017Ismael
 
tdc-2020-poa-pedra-tesoura-papel
tdc-2020-poa-pedra-tesoura-papeltdc-2020-poa-pedra-tesoura-papel
tdc-2020-poa-pedra-tesoura-papelDouglas Siviotti
 
Tdc2014 - Guia do Tester Técnico das Galáxias
Tdc2014 - Guia do Tester Técnico das GaláxiasTdc2014 - Guia do Tester Técnico das Galáxias
Tdc2014 - Guia do Tester Técnico das GaláxiasLeonardo Galani
 
Lei de Demeter parte
Lei de Demeter parteLei de Demeter parte
Lei de Demeter parteJorge Oleques
 
5 coisas que você deve evitar em sua estratégia de testes automatizados - TDC...
5 coisas que você deve evitar em sua estratégia de testes automatizados - TDC...5 coisas que você deve evitar em sua estratégia de testes automatizados - TDC...
5 coisas que você deve evitar em sua estratégia de testes automatizados - TDC...Samuel Lucas
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...Joberto Diniz
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 
TDC - [Cuidado] Pareando dados com o uso de ferramentas pairwise - SP/2017
TDC - [Cuidado] Pareando dados com o uso de ferramentas pairwise - SP/2017TDC - [Cuidado] Pareando dados com o uso de ferramentas pairwise - SP/2017
TDC - [Cuidado] Pareando dados com o uso de ferramentas pairwise - SP/2017Fernando Santiago
 

Mais procurados (20)

Novidades do c#6
Novidades do c#6Novidades do c#6
Novidades do c#6
 
O dilema
O dilemaO dilema
O dilema
 
TDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de GuardaTDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de Guarda
 
tdc-recife-2020-complexidade-cognitiva
tdc-recife-2020-complexidade-cognitivatdc-recife-2020-complexidade-cognitiva
tdc-recife-2020-complexidade-cognitiva
 
Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
 
Refinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoRefinamento e boas práticas de programação
Refinamento e boas práticas de programação
 
Page Object para Testers - The Developers Conference 2017
Page Object para Testers - The Developers Conference 2017Page Object para Testers - The Developers Conference 2017
Page Object para Testers - The Developers Conference 2017
 
Clean Code na Prática
Clean Code na PráticaClean Code na Prática
Clean Code na Prática
 
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboyComo melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
 
Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014
 
Como você testa seu software TDC 2017
Como você testa seu software  TDC 2017Como você testa seu software  TDC 2017
Como você testa seu software TDC 2017
 
tdc-2020-poa-pedra-tesoura-papel
tdc-2020-poa-pedra-tesoura-papeltdc-2020-poa-pedra-tesoura-papel
tdc-2020-poa-pedra-tesoura-papel
 
Tdc2014 - Guia do Tester Técnico das Galáxias
Tdc2014 - Guia do Tester Técnico das GaláxiasTdc2014 - Guia do Tester Técnico das Galáxias
Tdc2014 - Guia do Tester Técnico das Galáxias
 
Lei de Demeter parte
Lei de Demeter parteLei de Demeter parte
Lei de Demeter parte
 
5 coisas que você deve evitar em sua estratégia de testes automatizados - TDC...
5 coisas que você deve evitar em sua estratégia de testes automatizados - TDC...5 coisas que você deve evitar em sua estratégia de testes automatizados - TDC...
5 coisas que você deve evitar em sua estratégia de testes automatizados - TDC...
 
Design patterns de uma vez por todas
Design patterns de uma vez por todasDesign patterns de uma vez por todas
Design patterns de uma vez por todas
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
 
Aplicando SOLID com PHP7
Aplicando SOLID com PHP7Aplicando SOLID com PHP7
Aplicando SOLID com PHP7
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
TDC - [Cuidado] Pareando dados com o uso de ferramentas pairwise - SP/2017
TDC - [Cuidado] Pareando dados com o uso de ferramentas pairwise - SP/2017TDC - [Cuidado] Pareando dados com o uso de ferramentas pairwise - SP/2017
TDC - [Cuidado] Pareando dados com o uso de ferramentas pairwise - SP/2017
 

Semelhante a Programação Funcional usando C#

Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHPCombatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHPRodrigo Dos Santos
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosGabriel Schade Cardoso
 
TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7tdc-globalcode
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#tdc-globalcode
 
JSF 2 - Java "Super" Faces
JSF 2 - Java "Super" FacesJSF 2 - Java "Super" Faces
JSF 2 - Java "Super" FacesFilipe Portes
 
Usando Visão Computacional para Identificar Letras em Libras
Usando Visão Computacional para Identificar Letras em LibrasUsando Visão Computacional para Identificar Letras em Libras
Usando Visão Computacional para Identificar Letras em LibrasGabriel Schade Cardoso
 
Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#Paulo Cesar Ortins Brito
 
Implementando aplicativos Web com JSF
Implementando aplicativos Web com JSF Implementando aplicativos Web com JSF
Implementando aplicativos Web com JSF Otávio Santana
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdcLucas Teles
 
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014Jonathan Prates
 
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...Vinicius Campos Silva
 
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesTDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesSandro Giacomozzi
 
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...Bruno Tanoue
 
Tdc2015 bigdata-mpias-final-pdf
Tdc2015 bigdata-mpias-final-pdfTdc2015 bigdata-mpias-final-pdf
Tdc2015 bigdata-mpias-final-pdfMinistry of Data
 
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.Sergio Lima
 
Curso C# em Mono - Orientação a Objeto Basico
Curso C# em Mono - Orientação a Objeto BasicoCurso C# em Mono - Orientação a Objeto Basico
Curso C# em Mono - Orientação a Objeto BasicoAlessandro Binhara
 

Semelhante a Programação Funcional usando C# (20)

Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHPCombatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
Combatendo o Código Procedural - TDC 2012 Florianópolis - Trilha PHP
 
Uma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de errosUma abordagem funcional para gerenciamento de erros
Uma abordagem funcional para gerenciamento de erros
 
TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
 
Programação Funcional usando F#
Programação Funcional usando F#Programação Funcional usando F#
Programação Funcional usando F#
 
JSF 2 - Java "Super" Faces
JSF 2 - Java "Super" FacesJSF 2 - Java "Super" Faces
JSF 2 - Java "Super" Faces
 
Usando Visão Computacional para Identificar Letras em Libras
Usando Visão Computacional para Identificar Letras em LibrasUsando Visão Computacional para Identificar Letras em Libras
Usando Visão Computacional para Identificar Letras em Libras
 
Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#Utilizando a API do Roslyn, o novo compilador do C#
Utilizando a API do Roslyn, o novo compilador do C#
 
Implementando aplicativos Web com JSF
Implementando aplicativos Web com JSF Implementando aplicativos Web com JSF
Implementando aplicativos Web com JSF
 
Introducao Spring ROO
Introducao Spring ROOIntroducao Spring ROO
Introducao Spring ROO
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdc
 
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
 
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
[TDCPOA2018] Desmistificando a eXtreme Programming para desenvolvedores "não ...
 
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de TestesTDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
TDC Florianópolis 2019. Trilha Java - Arquitetura de Testes
 
Solid
SolidSolid
Solid
 
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
 
Tdc2015 bigdata-mpias-final-pdf
Tdc2015 bigdata-mpias-final-pdfTdc2015 bigdata-mpias-final-pdf
Tdc2015 bigdata-mpias-final-pdf
 
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
 
Curso C# em Mono - Orientação a Objeto Basico
Curso C# em Mono - Orientação a Objeto BasicoCurso C# em Mono - Orientação a Objeto Basico
Curso C# em Mono - Orientação a Objeto Basico
 
TDC 2016 Trilha Testes - Floripa
TDC 2016 Trilha Testes - FloripaTDC 2016 Trilha Testes - Floripa
TDC 2016 Trilha Testes - Floripa
 

Mais de Gabriel Schade Cardoso

Mais de Gabriel Schade Cardoso (14)

Clean Architecture com .NET Core
Clean Architecture com .NET CoreClean Architecture com .NET Core
Clean Architecture com .NET Core
 
C# 8 e ML.NET
C# 8 e ML.NETC# 8 e ML.NET
C# 8 e ML.NET
 
Machine Learning: Classificação de Comentários com Azure ML & Python
Machine Learning: Classificação de Comentários com Azure ML & PythonMachine Learning: Classificação de Comentários com Azure ML & Python
Machine Learning: Classificação de Comentários com Azure ML & Python
 
Desmistificando Machine Learning
Desmistificando Machine LearningDesmistificando Machine Learning
Desmistificando Machine Learning
 
Programação Funcional usando C# e F#
Programação Funcional usando C# e F#Programação Funcional usando C# e F#
Programação Funcional usando C# e F#
 
Programação Funcional para Humanos
Programação Funcional para HumanosProgramação Funcional para Humanos
Programação Funcional para Humanos
 
Arquitetura Limpa em .NET Core
Arquitetura Limpa em .NET CoreArquitetura Limpa em .NET Core
Arquitetura Limpa em .NET Core
 
Aplicações inteligentes com o Azure Cognitive Services
Aplicações inteligentes com o Azure Cognitive ServicesAplicações inteligentes com o Azure Cognitive Services
Aplicações inteligentes com o Azure Cognitive Services
 
Desmistificando machine learning
Desmistificando machine learningDesmistificando machine learning
Desmistificando machine learning
 
Introdução à programação funcional
Introdução à programação funcionalIntrodução à programação funcional
Introdução à programação funcional
 
A importância da programação funcional no dia a-dia
A importância da programação funcional no dia a-diaA importância da programação funcional no dia a-dia
A importância da programação funcional no dia a-dia
 
DDD linguagem ubiqua + codigo expressivo
DDD  linguagem ubiqua + codigo expressivoDDD  linguagem ubiqua + codigo expressivo
DDD linguagem ubiqua + codigo expressivo
 
TDC - Desenvolvendo com Kinect
TDC - Desenvolvendo com KinectTDC - Desenvolvendo com Kinect
TDC - Desenvolvendo com Kinect
 
Desenvolvendo com Kinect
Desenvolvendo com KinectDesenvolvendo com Kinect
Desenvolvendo com Kinect
 

Programação Funcional usando C#